Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Уникальные имена файлов


Автор: bems 26.5.2006, 01:31
Нужно в папку сохранять файлы без участия юзера. То есть имя должно быть уникальным.
При переборе этих файлов при помощи FindNextFile нужно чтобы они находились в порядке обратном порядку их создания. При этом не свои (юзерские) файлы не нужны вовсе (я их фильтрую по содержанию). 

Какие будут идеи по поводу алгоритма выбора имен?

У меня есть парочка, но вдруг кто-то чего поумнее предложит... 

Автор: Sunr1se 26.5.2006, 08:54
Есть такая идея: получать текущую дату и производить такие вычисления:
Код

Name := FloatToStr(year*100 + mounth + day/100 + hours/10000 + minutes/1000000);

В результате получится действительно уникальное число... Хотя, можно еще секунды и миллисекунды прибавлять. 

Автор: Yanis 26.5.2006, 09:17
Может просто IntToStr(GetTickCount)+'.txt'? 

Автор: Snowy 26.5.2006, 09:24
Yanis, не самый надежный способ.
И не удовлетворяет условию задачи.
Т.к. порядок получится вообще какой попало в зависимости от перезагрузки системы.
Код

  FileName := IntToStr($FFFFFFFF - Int64(now)) + '.dat';
end;
Вот так будет правильнее.

Добавлено @ 09:24 
Более поздние файлы должны идти по списку раньше.

Добавлено @ 09:25 
P.S. По дефолту, файндфёст будет находить файлы в порядке их создания, независимо от имени. 

Автор: bems 26.5.2006, 09:34
Цитата(Snowy @  26.5.2006,  09:24 Найти цитируемый пост)
P.S. По дефолту, файндфёст будет находить файлы в порядке их создания, независимо от имени. 
да? хреново...
 

Автор: Snowy 26.5.2006, 09:39
Ищи, добавляй в стринглист, сортируй - будет нужный результат.

Добавлено @ 09:41 
Как вариант - при добавлении нового файла, менять ему дату создания на более раннюю.
Но не факт, что поможет. Я не проверял. 

Автор: Yanis 26.5.2006, 09:50
Цитата(Snowy @  26.5.2006,  10:24 Найти цитируемый пост)
Yanis, не самый надежный способ.

Знаю, просто подумал, что может для простой задачи и так пойдёт.

bems
Почему бы вообще не завести свой тип файлов? 

Автор: bems 26.5.2006, 09:53
Цитата(Yanis @  26.5.2006,  09:50 Найти цитируемый пост)
Почему бы вообще не завести свой тип файлов?
Именно так я и сделал. Ну а как это касается темы?

Добавлено @ 09:55 
Цитата(Snowy @  26.5.2006,  09:39 Найти цитируемый пост)
Ищи, добавляй в стринглист, сортируй - будет нужный результат.

В проекте SysUtils - роскошь, а ты про стринглист smile  

Автор: Yanis 26.5.2006, 10:03
Цитата(bems @  26.5.2006,  10:53 Найти цитируемый пост)
Именно так я и сделал. Ну а как это касается темы?

Я имею, что файлы юзера и файлы твоей программы пересекаются. Может можн как то разграничить? В отдельные папки например... 

Автор: bems 26.5.2006, 10:11
Цитата(Yanis @  26.5.2006,  10:03 Найти цитируемый пост)
Я имею, что файлы юзера и файлы твоей программы пересекаются. Может можн как то разграничить? В отдельные папки например...  
Не пересекаются. Но теоретически могут. Он и лежат в отдельной папке, но выводить юзеру какие-либо сообщения смысла нет, все должно работать в фоновом режиме. И если юзер залезет в мою папочку и начнет там извращаться, то нужно вести себя как можно устойчивее.
 

Автор: Yanis 26.5.2006, 10:13
Тогда просто создавай файл - список нужных тебе файлов. И чужие файлы в этот список уже никак не влезут... 

Автор: bems 26.5.2006, 10:20
Цитата(Yanis @  26.5.2006,  10:13 Найти цитируемый пост)
Тогда просто создавай файл - список нужных тебе файлов. И чужие файлы в этот список уже никак не влезут...  
Усложняет все. Этот файл индекса уже не назовешь произвольно - нужно ж его как-то отличать от других. Поэтому придется делать предположение, что хотя бы такого имени еще нет. 

Автор: Snowy 26.5.2006, 11:04
Ну с уникальностью ясно.
Вопрос с упорядочиванием файлов.
Тебе нужен последний созданный файл или список файлов, упорядоченных по дате создания?
Если первое, то просто беги файндфёстом и бери последний.
Если второе, то беги фаёндфёстом и организуй стек из имен файлов.
Потом для работы просто доставай из стека по одному. 

Автор: bems 26.5.2006, 14:56
Цитата(Snowy @  26.5.2006,  11:04 Найти цитируемый пост)
Тебе нужен последний созданный файл или список файлов, упорядоченных по дате создания?
Клиент посылает проге дату последнего известного сообщения лога. В хедере файла есть начальная и конечная дата лога. Нужно передать клиенту информацию от текущей даты вниз до последней известной. Если искать в порядке убывания дат то будет значительно быстрее (считая что файлов сотни в пределе и нужно открывать для чтения каждыый в этом диапазоне)
 

Автор: Snowy 26.5.2006, 15:26
Но построить стрек имен файлов ведь недолго.
Для этого их совсем не нужно открывать.
Кроме того, если в имени файла уже заложена дата, то не нужно открывать все - можно сориентироваться по имени или дате создания. 

Автор: bems 26.5.2006, 17:46
Цитата(Snowy @  26.5.2006,  15:26 Найти цитируемый пост)
Но построить стрек имен файлов ведь недолго.
Для этого их совсем не нужно открывать.
Кроме того, если в имени файла уже заложена дата, то не нужно открывать все - можно сориентироваться по имени или дате создания.  
Точно принадлежность файла можно определить только по сигнатуре в хедере - а вдруг чужой?

Добавлено @ 17:50 
Цитата(bems @  26.5.2006,  17:46 Найти цитируемый пост)
Точно принадлежность файла можно определить только по сигнатуре 
И то не точно. Думаю добавить CRC
 

Автор: Snowy 26.5.2006, 17:59
Зачем. Просто создай своё персональное расширение для своих файлов.
Например '5123482835.ItsFileOfMyCoolProgram'
Или в конце концов создай GUID и используй его, как собственное расширение.
Файлов с расширением A8D329BD7C8B4E1DB88F3876B602EF64 точно не бывает. 

Автор: bems 26.5.2006, 18:04
Цитата(Snowy @  26.5.2006,  17:59 Найти цитируемый пост)
Просто создай своё персональное расширение для своих файлов
Уже сделал.
Цитата(Snowy @  26.5.2006,  17:59 Найти цитируемый пост)
Файлов с расширением A8D329BD7C8B4E1DB88F3876B602EF64 точно не бывает.
Не бывает. А если глядя на мои юзер скопирует? И скажи что никто этим не займется!
 

Автор: Snowy 26.5.2006, 18:13
Главное, что в стандартных условиях большинство файлов сразу отсеится.
А в нестандартных - юзер сам виноват.
Проверку нуно делать перед использованием конкретного файла.
Проверять все - незачем. 

Автор: Mechanic 26.5.2006, 23:51
Цитата(bems @  26.5.2006,  18:04 Найти цитируемый пост)
Не бывает. А если глядя на мои юзер скопирует? И скажи что никто этим не займется!

Как бы ни ухищрялся, всегда найдётся изобретательный идиот, который сделает именно то, о чем ты не подумал.  smile 
Проще в описании программы написать "в папке данных программы нельзя создавать / изменять / удалять / переименовывать файлы".  Никто ведь Биллу не дотумкается выставить счет, если при удалении случайных файлов пакета Microsoft Office, тот случайно перестанет работать.  smile 

А защитить файлы можно просто раздачей прав на папку (NTFS rules).

Цитата(bems @  26.5.2006,  14:56 Найти цитируемый пост)
Клиент посылает проге дату последнего известного сообщения лога. В хедере файла есть начальная и конечная дата лога.

Не знаю. Если бы меня попросили реализовать нечто подобное, я бы полностью абстрагировался от этих "изобретательных идиотов", и сделал бы диапазон дат лога в его имени. Типа 

ГГГГММДДЧЧММСС_ГГГГММДДЧЧММСС.MyExt

тогда бы поиск файлов был бы простым перебором всех имен.

Просто в этом случае нужно было бы проверять корректность системных часов (да хоть при запуске), чтоб не было запусков "в прошлом".

И уж если очень захотелось бы быть уверенным в целостности файла, то прикрутил бы к нему какой-нить хэш в конце (типа CRC, SHA1 etc, только чуть подкриптованных и измененных, чтоб отсеять и очень изобретательных идиотов  smile ) 

Автор: bems 27.5.2006, 13:28
Цитата(Snowy @  26.5.2006,  18:13 Найти цитируемый пост)
Главное, что в стандартных условиях большинство файлов сразу отсеится.
А в нестандартных - юзер сам виноват.
А юзеру эта прога и не нужна. Нужна она админу. Так что "юзер виноват" не оправдание

Цитата(Snowy @  26.5.2006,  18:13 Найти цитируемый пост)
Проверку нуно делать перед использованием конкретного файла.
Используются на другой машине. Что, отправлять кучу лишнего, а там уже разбираться? Дорорговато...

Цитата(Mechanic @  26.5.2006,  23:51 Найти цитируемый пост)
Никто ведь Биллу не дотумкается выставить счет, если при удалении случайных файлов пакета Microsoft Office, тот случайно перестанет работать
Если моя прога перестанет работать юзер только обрадуется. Вот если бы тачку перезагрузить в случае глюков smile 

Цитата(Mechanic @  26.5.2006,  23:51 Найти цитируемый пост)
А защитить файлы можно просто раздачей прав на папку (NTFS rules).
это отдельный разговор

Цитата(Mechanic @  26.5.2006,  23:51 Найти цитируемый пост)
И уж если очень захотелось бы быть уверенным в целостности файла, то прикрутил бы к нему какой-нить хэш в конце (типа CRC, SHA1 etc, только чуть подкриптованных и измененных, чтоб отсеять и очень изобретательных идиотов   )  

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

Автор: Mechanic 27.5.2006, 15:26
Цитата(bems @  27.5.2006,  13:28 Найти цитируемый пост)
Проверку нуно делать перед использованием конкретного файла.

Используются на другой машине. Что, отправлять кучу лишнего, а там уже разбираться? Дорорговато...


Тогда нужно хэш тулить уже в имя файла.  smile  Например, помимо даты/времени (с секундами) добавлять в имя рэндомное число, и хитрый хеш на эту часть имени. Тогда легко проверить имя валидно / нет, даже не загружая файл. 

Автор: bems 27.5.2006, 16:05
Спасибо, ребята. 
Останавливаюсь на следующем:
 1. Файлы называются ггггммддччммссс.gsrtrs5ysrwrevthh.ext         где ггггммддччммссс время ПЕРВОГО сообщения в логе, а gsrtrs5ysrwrevthh выбирается во время сохранения
 2. Вхедере оставляю и время первого и время последнего сообщения.
 3. При чтении директории для выбора очередности обработки игнорирую все после первой точки
 4. Отправляю на тачку админа файлы, в имени которых есть дата и время после указанных в запросе клиентской части проги.
 5. Открываю файл, предшествующий по дате и времени (тех что в имени) первому отправленному и проверяю на частичное соответствие запросу. Если запрошенная клиентом дата где-то в середине этого файла, то отправляю и этот.

Думаю, тема закрыта. Если есть замечания  по поводу этой схемы, то прошу... 

Автор: Mechanic 27.5.2006, 17:11
Цитата(bems @  27.5.2006,  16:05 Найти цитируемый пост)
а gsrtrs5ysrwrevthh выбирается во время сохранения

По какому принципу? И есть ли фильтрация по именам до открытия файлов и чнения хедеров?

Представим, я тупой юзверь, и запустил вот такую программу:
Код

 ггггммддччммссс := Завтра, вечер;
 Сч: Целое = 0;
 Для Сч := 0 по МаксЦелое Цикл
      ИмяФайла :=  ггггммддччммссс + ".gsrtrs5ysrwrevthh" + 
      Строка(Сч)+".ext";
      СоздатьФайл(Именно_Та_Злосчастная_Папка + ИмяФайла);
 КонецЦикла;

smile
Админ асилит стока файлов? 

Автор: Snowy 27.5.2006, 17:17
Просто нужно еще на стороне клиента проверять - правильный файл или нет. 

Автор: bems 27.5.2006, 17:33
Цитата(Mechanic @  27.5.2006,  17:11 Найти цитируемый пост)
Цитата(bems @  27.5.2006,  16:05 )
а gsrtrs5ysrwrevthh выбирается во время сохранения


По какому принципу?
рандомно, пока ERROR_ALREADY_EXISTS  smile 

Цитата(Mechanic @  27.5.2006,  17:11 Найти цитируемый пост)
И есть ли фильтрация по именам до открытия файлов и чнения хедеров?
да. ты ж сам предлягал дату в имя внести.

Цитата(Mechanic @  27.5.2006,  17:11 Найти цитируемый пост)
Представим, я тупой юзверь, и запустил вот такую программу:
Цитата(Mechanic @  27.5.2006,  17:11 Найти цитируемый пост)
Админ асилит стока файлов?  


админ - не знаю, сетка - с трудом

Цитата(Snowy @  27.5.2006,  17:17 Найти цитируемый пост)
Просто нужно еще на стороне клиента проверять - правильный файл или нет.  
само собой

  

Автор: Mechanic 28.5.2006, 19:57
Цитата(bems @  27.5.2006,  17:33 Найти цитируемый пост)
рандомно, пока ERROR_ALREADY_EXISTS

Я ж совсем другое предлагал..  smile 
Предлагал ввести CRC в имя, чтоб валидность его можно было проверить, не открывая файл.

Вот, накропал пример. Там использовал чуть измененный CRC32 - изменил сам полином, и начальное число. Плюс ещё данные XOR'ю ключом. Не думаю, что найдется у вас юзверь, что этот хаш сможет сгенерить без ковыринга в сорцах.  smile 

Вот образцы валидных сгенеренных имен.
200605281950437127B0974C8.ext
2006052819505540079C9687D.ext
20060528195104150BF12C7CA.ext

А по ходу нашел забойную книжу! Советую всем, кто хочет в CRC разобраться
http://www.rsdn.ru/article/files/classes/SelfCheck/crcguide.pdf

 

Автор: bems 28.5.2006, 21:09
Цитата(Mechanic @  28.5.2006,  19:57 Найти цитируемый пост)
Я ж совсем другое предлагал..  
Я тебя отлично понял smile 
А что делать если имя мое, а содержимое левое? Я имею ввиду, что все равно придется проверять валидность содержимого на стороне клиента. А твой способ - как один из этапов я использую.

За книжку и исходник огромное спасибо. И плюс 

Автор: Mechanic 28.5.2006, 21:15
Нема за що. Тема просто интересная.  smile

Добавлено @ 21:25 
 smile  (ну не удержался)
Цитата(bems @  28.5.2006,  21:09 Найти цитируемый пост)
А что делать если имя мое, а содержимое левое?


 smile  У меня такое иногда после праздников бывает..  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)