Как сделать, чтобы файлы создавались по номерам, по порядку?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Forgott
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 05.11.2006 (Вс) 10:59

Как сделать, чтобы файлы создавались по номерам, по порядку?

Сообщение Forgott » 01.08.2008 (Пт) 15:08

Народ!
Подскажите, плиззз, как сделать так, чтобы файлы создавались по номерам, по порядку при нажатии скажем на кнопку. Например: z001.txt, z002.txt, z003.txt и т.д.. Если можно, то код попроще, чтобы разобраться можно было. Заранее спасибо!

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2008 (Пт) 15:26

А в чем собственно проблема то? Создай переменную-счетчик на уровня формы и увеличивай ее при обработке нажатия кнопки. В соотвествии со значением переменной создавай название файла.
Весь мир матрица, а мы в нем потоки байтов!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 01.08.2008 (Пт) 15:50

Код: Выделить всё
Private Counter As Long

Private Sub Command1_Click()
  Dim FileName As String, FN As Integer
  Counter = Counter + 1
  FileName = "z" & Format$(Counter, "000") & ".txt"
  FN = FreeFile
  Open FileName For Output As #FN
  Print #FN, "test"
  Close #FN
End Sub
Lasciate ogni speranza, voi ch'entrate.

BasiС
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 64
Зарегистрирован: 16.02.2006 (Чт) 23:34
Откуда: Koenigsberg

Re: Как сделать, чтобы файлы создавались по номерам, по поря

Сообщение BasiС » 01.08.2008 (Пт) 18:33

Forgott писал(а):Народ!
Подскажите, плиззз, как сделать так, чтобы файлы создавались по номерам, по порядку при нажатии скажем на кнопку. Например: z001.txt, z002.txt, z003.txt и т.д.. Если можно, то код попроще, чтобы разобраться можно было. Заранее спасибо!


Есть более изящный способ - через API.

GetTempFileName создает имя для временного файла для использования вашим приложением. Кстати, функция может создать только имя файла без создания самого файла. Имя файла включает в себя весь полный путь и содержится в lpTempFileName. Формат создаваемого файла путь\preuuuu.tmp, где pre - первые три символа имени файла, а uuu - шестнадцатиричное число между 0000 and FFFF, присоединяемое к этим символам



Код: Выделить всё
Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long

' Создадим временный файл вида (path)\rusuuu.TMP,
' где (path) -это папка Windows,
' а uuuu - число, созданное функцией

Dim temppath As String  ' имя папки
Dim tempfile As String  ' имя файла
Dim slength As Long  ' длина пути
Dim lastfour As Long  ' hex-значение для uuuu

' Используем Windows, как временную папку
' Создадим буфер для хранения имени папки
temppath = Space(255)
slength = GetTempPath(255, temppath)
temppath = Left(temppath, slength)

' Создаем файл
' Создадим буфер для имени файла
tempfile = Space(255)
lastfour = GetTempFileName(temppath, "rus", 0, tempfile)
tempfile = Left(tempfile, InStr(tempfile, vbNullChar) - 1)
Debug.Print "Имя временного файла: "; tempfile

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 02.08.2008 (Сб) 6:17

BasiС, и в чем же большее изящество по сравнению со способом от alibek?
Весь мир матрица, а мы в нем потоки байтов!

IIaTpuOT
Начинающий
Начинающий
 
Сообщения: 13
Зарегистрирован: 27.07.2008 (Вс) 18:41

Re: Как сделать, чтобы файлы создавались по номерам, по поря

Сообщение IIaTpuOT » 02.08.2008 (Сб) 11:55

Forgott писал(а):Народ!
Подскажите, плиззз, как сделать так, чтобы файлы создавались по номерам, по порядку при нажатии скажем на кнопку. Например: z001.txt, z002.txt, z003.txt и т.д.. Если можно, то код попроще, чтобы разобраться можно было. Заранее спасибо!


Код: Выделить всё
Dim fso As New FileSystemObject, fl As File
Dim Ni As Integer
Dim strok As String
Ni = 0 ' задали начало
Do Until Ni = Text1.Text ' до заданого значения
Ni = Ni + 1
strok = "z" & Ni & ".txt"
Set fl = fso.CreateTextFile(strok)
Loop

Может что-то похожее ... это по поводу именно создания
что касается нумерации ... то самый простой способ это только доведение до сотен можно обойтись простым сравнением числа и добавкой двух или одного нуля

Forgott
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 05.11.2006 (Вс) 10:59

Сообщение Forgott » 02.08.2008 (Сб) 12:28

Больше всего понятен код alibek'a, но есть одно "но" - когда перезапускаешь прогу, она создает файлы по новому, а надо, чтобы находила последний созданный и нумеровала с него дальше.

Forgott
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 05.11.2006 (Вс) 10:59

Сообщение Forgott » 02.08.2008 (Сб) 12:42

Понимаю так, что надо делать так:

1. проверяем наличие файла
2. если есть, то делаем следующий

Вопрос тока: как?
Времени, увы, сейчас нет, чтобы самому разбираться...

Forgott
Начинающий
Начинающий
 
Сообщения: 8
Зарегистрирован: 05.11.2006 (Вс) 10:59

Сообщение Forgott » 02.08.2008 (Сб) 13:19

В итоге, сам нашел выход :D

File1.Refresh
File1.filename = "*.txt"
fn = File1.ListCount
If fn >= 9 Then
fn = fn + 1
Open "c:\sal" & fn & ".txt" For Output As #1
Print #1, "test"
Close #1
Else
fn = fn + 1
Open "c:\sal0" & fn & ".txt" For Output As #1
Print #1, "test"
Close #1
End If

Эх!... Сам не заморочишься, никто не поможет...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.08.2008 (Сб) 13:50

Forgott
Гадость.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 02.08.2008 (Сб) 15:32

Forgott

Сделано криво. Это как ехать в Москву из Питера через Владивосток.



Смотри, как надо

Код: Выделить всё
Function getNextFileName(baseName As String, Optional extension As String = "txt", Optional ByVal startIndex As Long = 0) As String
Dim tempFileName As String
Do Until Len(Dir(tempFileName)) = 0
tempFileName = baseName + Format(startIndex, "00000") + "." + extension
startIndex = startIndex + 1
Loop
getNextFileName = tempFileName
End Function




Вот эта функция будет тебе возвращать для на каждый вызов имя следующего файла.
I don't understand. Sorry.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 03.08.2008 (Вс) 21:51

Проще именть вспомогателяный файл (я для этого имею БД) и заносить туда имя каждого создаваемого файла. Когда создаешь очередной, считываешь последнее значение и соответственно прибавляешь 1.
Пишите жизнь на чистовик.....переписать не удастся.....

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Сообщение Proxy » 03.08.2008 (Вс) 22:39

Немного по теме: на самсунге мобилке фотки нумеровались Photo<###>.jpg .Страшно бесило, что счётчик нельзя было сбросить. А на следующем аппарате фотки нумеровались DD-MM-YYYY.jpg, что ж, полагаю что в данном случае не стоило бояться, что при проходе счётчиком фотки 999 аппарат начнёт затирать старые фотки. Заметьте, ни в одном из данных случаев не заюзана тотальная проверка наличия файла номер ХХХ, т.к. при низкой производительности процессора мобильного телефона это может занимать немало времени.
Вывод: не всегда стоит применять эту методу, иногда стоит прибегнуть либо к локальной базе, либо к независимому счётчику. Например при обращении к удалённой БД было бы неразумно проверять наличие каждого файла ХХХ до первого отсутствия, а локальная БД и прибавление счётчика в случае ошибки (например файл был создан неожиданно для данного хоста в совместной БД) вполне поможет. ЗЫ. не кидайте тапками по поводу БД, я говорю про конкретную БД со своим протоколом управления, в которой такой эффект наблюдается и на практике выяснилось, что это не особо проблематично.
Follow the white rabbit.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 04.08.2008 (Пн) 13:53

SLIM

Это ни разу не проще, а криво и ненадежно. А что если кто-то снес такой файл? А создал такой же, с именем +1, пока прога делала что то другое?

Не надо себя изолировать от внешнего мира, это не полезно.
I don't understand. Sorry.

SLIM
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1840
Зарегистрирован: 04.04.2008 (Пт) 18:21
Откуда: Краснодар

Сообщение SLIM » 04.08.2008 (Пн) 20:46

RayShade
Любое приложение, способное создавать файлы должно уметь и удалять их. Если рассуждать как ты, так и любую dll можно удалить, и приложение работать не будет. Есть приложение, есть его каталог, там есть файлы которые создаются программно. Значит и удалять их нужно программно. Еще раз - даже если настройки приложения хранятся в реестре, то чьи-то кучерявые ручки могут эти ключи и удалить. Ну в крайнем случае можно прочитать все файлы в каталоге (нужном) и прибавлять 1. А лучше скрыть папку от посторонних глаз
Пишите жизнь на чистовик.....переписать не удастся.....

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 05.08.2008 (Вт) 10:55

SLIM

Не разводи тут демагогию. Система за тебя уже хранит всю информацию в оглавлении диска. Тебе остается только в нужный момент прочитать ее и сделать соответствующую операцию.

Следует помнить что в многозадачной системе большинство данных о ее состоянии верны только очень короткий промежуток времени.

И любой огород типа реестра, скрывать папки с страдать прочей херней.
I don't understand. Sorry.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 65

    TopList