powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
20 сообщений из 20, страница 1 из 1
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37220872
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программа генерирует файлы и кладет их в определенную папку.
Имена файлов не должны пересекаться, следить че там есть было будет, хранить число и увеличивать на 1 -неохота.
Свой файл, свои дела.
Разумно привязываться к времени.
типа ггммддччммсс
вероятность попасть 2 раза в одну секунду есть.
ну ладно ггммддччммсс+миллисекунды
ну, при каком-то маловероятном случае можно попасть и в миллисекунду, ну мало-ли, какой-то левый процесс тормознул дела на компьютере и два файла свалились одновременно (или скорее тот "кто файлы делает" "быстро сработал в 2 потока").
Можно добавить еще случайное число скажем от 0 до 1000 (на vb кстати такой ф-ции не знаю, насколько помню Rnd мается одной и той же дурью).

Ну и наконец как-то посолидней файлы обозвать надо.
Типа
3B54B0B2
3B54AF7D
3B2F1681
39BC5A37
390F9B17

Как бы все это дело грамотно об Hex ить ?
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37220928
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему не последовательная нумерация? А почему не случайная с проверкой на существование? А почему не использование системной функции создания и открытия файла со случайным именем?
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37220978
DUDALS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте MD5
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37220996
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,
"солидное" добавление к YYYYMMDDHHMISS
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Dim fso, i%, k%, col as Collection
Set fso = CreateObject("Scripting.FileSystemObject")
Set col = New Collection
On Error Resume Next
For i =  1  to  1000 
col.Add i, fso.GetTempName()
If Err.Number Then
  Err.Clear
  k = k +  1   
End If
Next i
Debug.Print "Дубликатов на тышу: "; k
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37221063
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВИКИПЕДИЯGUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов. Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,4028×1038), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, достаточно мала.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Private Declare Function CoCreateGuid Lib "ole32.dll" (buffer As Byte) As Long

Private Declare Function StringFromGUID2 Lib "ole32.dll" (buffer As Byte, ByVal lpsz As Long, ByVal cbMax As Long) As Long

Private Function getGUID() As String
Dim buffer( 0  To  15 ) As Byte
Dim s As String
Dim ret As Long

s = String$( 128 ,  0 )

' получает численный код
ret = CoCreateGuid(buffer( 0 ))

' преобразуем его в текст,
' используя недокументированную функцию StrPtr
ret = StringFromGUID2(buffer( 0 ), StrPtr(s),  128 )

getGUID = Left$(s, ret -  1 ) ' отсекаем "хвост"

End Function
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37221187
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще 5 копеек
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Private 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
Private Declare Function GetTempPath Lib "kernel32" Alias "GetTempPathA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

Private Function GenTempName() As String
Dim sPrefix As String
Dim lUnique As Long
Dim sTempFileName As String
Dim sPath As String
    sPath = Space( 1024 )
    GetTempPath  1024 , sPath
    sPrefix = "fVB"
    lUnique =  0 
    sTempFileName = Space$( 100 )
    GetTempFileName sPath, sPrefix, lUnique, sTempFileName
    sTempFileName = Mid$(sTempFileName,  1 , InStr(sTempFileName, Chr$( 0 )) -  1 )
    GenTempName = sTempFileName
End Function
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37221700
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

GetTempFileName - я обратил внимание на нее, но она не в тему. Еще и файл в tmp создает. М.б. есть параметры, но лучше с ней здесь не вязаться.

скукотищаДмитрий77,
"солидное" добавление к YYYYMMDDHHMISS
...
Set fso = CreateObject("Scripting.FileSystemObject")

Ничего солидного в Scripting.FileSystemObject не вижу. Неповторяемость можно проверить через Dir если на то пошло.

AkinaА почему не последовательная нумерация? ...
Потому что настройки проги накроются, а файлы и логи останутся. Он нужен, этот лишний гимор?

HandKot, ваш пример красив (проверил) очень крут, ну т.е. слишком очень.

В общем, накрутил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
Option Explicit

Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private Declare Function GetSystemTime Lib "kernel32" _
(lpSystemTime As SYSTEMTIME) As Long
Private Declare Function GetLocalTime Lib "kernel32" _
(lpSystemTime As SYSTEMTIME) As Long

Public Function StringCurTimeRndHex() As String
    Dim conSystemTime As SYSTEMTIME
    Dim s_len As Integer
    GetLocalTime conSystemTime
    Randomize
    StringCurTimeRndHex = Hex(conSystemTime.wYear) & _
      Hex(conSystemTime.wMonth) & _
      Hex(conSystemTime.wDay) & _
      Hex(conSystemTime.wHour) & _
      Hex(conSystemTime.wMinute) & _
      Hex(conSystemTime.wSecond) & _
      Hex(conSystemTime.wMilliseconds) & _
      Hex(CLng(Rnd( 999 ) *  1000 ) -  1 )
    s_len = Len(StringCurTimeRndHex)
    If s_len >  18  Then
        StringCurTimeRndHex = Left(StringCurTimeRndHex,  18 )
    ElseIf s_len <  18  Then
        StringCurTimeRndHex = StringCurTimeRndHex & Right(StringCurTimeRndHex,  18  - s_len)
    End If
End Function

По хорошему, есть понятие Time Stamp (штамп времени ) в hex? в линукс?
но не знаю как правильно его получить, в принципе какая разница.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37222182
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77GetTempFileName - я обратил внимание на нее, но она не в тему. Еще и файл в tmp создает. М.б. есть параметры, но лучше с ней здесь не вязаться.
Сказки. Просто надо вызывать его как метод объекта Folder, полученного через GetFolder от требуемой папки.

Дмитрий77Ничего солидного в Scripting.FileSystemObject не вижу.
Ну да ну да, всё, что выше АПИ - ацтой...

Дмитрий77настройки проги накроются, а файлы и логи останутся. Он нужен, этот лишний гимор?
А при чём тут настройки программы? файлы остались, определить следующий номер (первый свободный) - задачка для второго класса. К тому же, если возможен вариант "накроются" - надо думать о приведении в порядок надёжности системы, а не о программировании.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37222303
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДмитрий77Ничего солидного в Scripting.FileSystemObject не вижу.
Ну да ну да, всё, что выше АПИ - ацтой...
Akina, ничего против вас лично не имею. Но с FileSystemObject я в свое время намучился, долго объяснять...

AkinaДмитрий77настройки проги накроются, а файлы и логи останутся. Он нужен, этот лишний гимор?
А при чём тут настройки программы? файлы остались, определить следующий номер (первый свободный) - задачка для второго класса. К тому же, если возможен вариант "накроются" - надо думать о приведении в порядок надёжности системы, а не о программировании.
"накроются" -элементарно, при переустановке прога удаляет конфигурацию (ну уж извините,мало чего там юзер попортил...ошибки с собой не тащим)

А вы прикиньте, что два независимых потока одновременно выяснили, что следующий файл должен называться blablabla120, а на появление самого файла уходит 1-2 сек например от момента принятия решения о его имени.
Вот поэтому и разумно привязываться к миллисекундам и разбавлять случайным числом.
Ну или действит. супер-GUID
А проверка на существование может вообще не помочь в описанной ситуации, не так ли? Поэтому при грамотном алгоритме от нее можно и вовсе отказаться.

Лучше мне расскажите, как конвертировать тек. время в Штамп Времени в hex, и что это вообще такое, дабы сделать мою ф-цию более каноничной что-ли.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37222393
NullUzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дмитрий77,

VB.NET код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Imports System.IO

Module Test

    Sub Main(ByVal args() As String)

        Dim sFileName As String = Guid.NewGuid.ToString
        Dim aFile As FileStream = File.Create(Path.Combine(Environ("Temp"), sFileName))

        Console.WriteLine("Файл {0} был удачно создан", sFileName)
        Console.ReadKey()

    End Sub

End Module
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37222676
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Дмитрий77
> А вы прикиньте, что два независимых потока одновременно выяснили, что следующий файл должен называться
> blablabla120, а на появление самого файла уходит 1-2 сек например от момента принятия решения о его имени.


И что? в любом случае должна быть обработка ошибок. Ловиш ошибку, что такой файл существует и генериш новое имя. И так
пока не запишется файл или пользователь не нажмет кнопку "Отмена"

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37223293
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77с FileSystemObject я в свое время намучился, долго объяснять...
Ок. Хотя обычно проблемы с ним связаны с тем, что не понята его объектная модель.

Дмитрий77как конвертировать тек. время в Штамп Времени в hex
Гм... а нафига? Просто строковое представление устроит? тогда

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

' ....

Dim addr As Long
Dim b( 1  To  8 ) As Byte
Dim i As Integer
Dim s As String
Dim dt As Date

' ....

s = ""
dt = Now()
addr = VarPtr(dt)
CopyMemory b( 1 ), ByVal addr,  8 
For i =  1  To  8 
    s = Hex(b(i)) & s
Next i
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37223767
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaДмитрий77с FileSystemObject я в свое время намучился, долго объяснять...
Ок. Хотя обычно проблемы с ним связаны с тем, что не понята его объектная модель.

Вынуждаете напрягаться панимаешь ли, поиск производить.

scrrun.dll CreateObject("Scripting.FileSystemObject")

Токо эта тема закрыта. Навсегда.

AkinaГм... а нафига? Просто строковое представление устроит? тогда...
Тогда моя ф-ция выше лучше и надежней, и красивше с чем согласитесь конечно.
В прилагаемом проекте Command2 +смотреть в дебаг.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37225537
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77scrrun.dll CreateObject("Scripting.FileSystemObject")
Т.е. Вы нашли какие-то свойства или методы у FSO, которые в 98-х отличаются от таковых в 2000? причём именно в минус? А что именно? Потому как в 98-х была версия 3.0 (та же, что и в 2000), в ХР - версия 5.0, полностью обратно совместимая с 3.0... или речь о 16-битном VB-приложении (в какой это было версии последний раз, в третьей вроде)?

Дмитрий77Тогда моя ф-ция выше лучше и надежней, и красивше с чем согласитесь конечно.
В прилагаемом проекте Command2 +смотреть в дебаг.
Посмотрел. Не соглашусь. У меня - 13 строк, в т.ч. половина ушла на дефиниции, у тебя же на такую фигню целый модуль пашет.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37225636
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Проблема не в модуле (я к таким API наворотам нормально отношусь), а в том что ваша ф-ция, не дает требуемого результата (т.е. цикл от 1 до 10 выводит одно и то же число, даже если чуть подворотить вашу, то будут повторяющиеся варианты). У меня используется
1) миллисикундная точность
2) добавлена случайность

Это полностью (даже 2 файла за 1мс маловероятно реально) гарантирует неповторимость имен. Ну т.е. мне такая точность более чем. От GUID я отказался, т.к. визуально начала файлов разные, а у меня они как бы автосортированы по имени /времени.

А по поводу сервера сценариев виндоус, Вы знаете, у меня нет никакого желания опускаться и разгребать эту муть еще раз.
Есть API, и есть способ тупого чтения файла в лоб.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37225696
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77ваша ф-ция, не дает требуемого результата (т.е. цикл от 1 до 10 выводит одно и то же число, даже если чуть подворотить вашу, то будут повторяющиеся варианты). У меня используется
1) миллисикундная точность
2) добавлена случайность

Это полностью (даже 2 файла за 1мс маловероятно реально) гарантирует неповторимость имен. Ну т.е. мне такая точность более чем.
Ну ещё бы! я время тупо беру у Now(), у которого дискретность емнип 55 мс. Загони в ту же переменную не то, что она даёт, а datetime с миллисекундами (нехватает байтов? ну добавь) - и вот оно, щастье...
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37225735
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaНу ещё бы! я время тупо беру у Now(), у которого дискретность емнип 55 мс.
Как это тебе удалось?
Я от Now не добился дискретности менее секунды.
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37225916
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не нравится мне использование Format, не люблю его... Т.е. вот такое что-то...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Private Type SYSTEMTIME
    wYear As Integer
    wMonth As Integer
    wDayOfWeek As Integer
    wDay As Integer
    wHour As Integer
    wMinute As Integer
    wSecond As Integer
    wMilliseconds As Integer
End Type

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetLocalTime Lib "kernel32" (lpSystemTime As SYSTEMTIME) As Long

' ....

Dim addr As Long
Dim b( 1  To  16 ) As Byte
Dim i As Integer
Dim s As String
Dim dt As SYSTEMTIME

' ....

s = ""
GetLocalTime dt
addr = VarPtr(dt)
CopyMemory b( 1 ), ByVal addr,  16 
For i =  1  To  16 
    s = s & Hex(b(i))
Next i
и рандом довесить, если надо...
Shocker.ProAkinaНу ещё бы! я время тупо беру у Now(), у которого дискретность емнип 55 мс.
Как это тебе удалось?
Я от Now не добился дискретности менее секунды.Да, у Now - секунда. А вот у Timer - 55 мс. Перепутал. Бывает...
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37226701
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
мысли вслух
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
' ...
Dim addr As Long
Dim b( 1  To  4 ) As Long ' будет меньше шагов у цикла For
Dim i As Integer
Dim s As String
Dim dt As SYSTEMTIME

' ....

s = ""
GetLocalTime dt
addr = VarPtr(dt)
CopyMemory b( 1 ), ByVal addr,  16 
For i =  1  To  4 
    s = s & Hex(b(i))
    ' s = s & Right("0000000" & Hex(b(i)), 8) ' "выравнивание"
Next i
...
Рейтинг: 0 / 0
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
    #37226957
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несомненно. Но это уже на этапе написания кода, на не генерации идеи.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]