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

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

Как бы все это дело грамотно об Hex ить ?
...
Рейтинг: 0 / 0
18.04.2011, 08:57
    #37220928
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
А почему не последовательная нумерация? А почему не случайная с проверкой на существование? А почему не использование системной функции создания и открытия файла со случайным именем?
...
Рейтинг: 0 / 0
18.04.2011, 09:39
    #37220978
DUDALS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
Попробуйте MD5
...
Рейтинг: 0 / 0
18.04.2011, 09:48
    #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
18.04.2011, 10:28
    #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
18.04.2011, 11:19
    #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
19.04.2011, 01:17
    #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
19.04.2011, 11:46
    #37222182
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
Дмитрий77GetTempFileName - я обратил внимание на нее, но она не в тему. Еще и файл в tmp создает. М.б. есть параметры, но лучше с ней здесь не вязаться.
Сказки. Просто надо вызывать его как метод объекта Folder, полученного через GetFolder от требуемой папки.

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

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

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

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

Лучше мне расскажите, как конвертировать тек. время в Штамп Времени в hex, и что это вообще такое, дабы сделать мою ф-цию более каноничной что-ли.
...
Рейтинг: 0 / 0
19.04.2011, 12:53
    #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
19.04.2011, 14:15
    #37222676
Игорь Горбонос
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
> Автор: Дмитрий77
> А вы прикиньте, что два независимых потока одновременно выяснили, что следующий файл должен называться
> blablabla120, а на появление самого файла уходит 1-2 сек например от момента принятия решения о его имени.


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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
19.04.2011, 18:03
    #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
20.04.2011, 04:50
    #37223767
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
AkinaДмитрий77с FileSystemObject я в свое время намучился, долго объяснять...
Ок. Хотя обычно проблемы с ним связаны с тем, что не понята его объектная модель.

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

scrrun.dll CreateObject("Scripting.FileSystemObject")

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

AkinaГм... а нафига? Просто строковое представление устроит? тогда...
Тогда моя ф-ция выше лучше и надежней, и красивше с чем согласитесь конечно.
В прилагаемом проекте Command2 +смотреть в дебаг.
...
Рейтинг: 0 / 0
20.04.2011, 21:48
    #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
20.04.2011, 23:08
    #37225636
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
Akina,

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

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

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

Это полностью (даже 2 файла за 1мс маловероятно реально) гарантирует неповторимость имен. Ну т.е. мне такая точность более чем.
Ну ещё бы! я время тупо беру у Now(), у которого дискретность емнип 55 мс. Загони в ту же переменную не то, что она даёт, а datetime с миллисекундами (нехватает байтов? ну добавь) - и вот оно, щастье...
...
Рейтинг: 0 / 0
21.04.2011, 00:28
    #37225735
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
AkinaНу ещё бы! я время тупо беру у Now(), у которого дискретность емнип 55 мс.
Как это тебе удалось?
Я от Now не добился дискретности менее секунды.
...
Рейтинг: 0 / 0
21.04.2011, 09:04
    #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
21.04.2011, 14:22
    #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
21.04.2011, 15:46
    #37226957
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи?
Несомненно. Но это уже на этапе написания кода, на не генерации идеи.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Генератор случайного имени файла (одинаковых быть не должно! никогда!). Идеи? / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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