| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Уникальные имена файлов |
| Автор: bems 26.5.2006, 01:31 |
| Нужно в папку сохранять файлы без участия юзера. То есть имя должно быть уникальным. При переборе этих файлов при помощи FindNextFile нужно чтобы они находились в порядке обратном порядку их создания. При этом не свои (юзерские) файлы не нужны вовсе (я их фильтрую по содержанию). Какие будут идеи по поводу алгоритма выбора имен? У меня есть парочка, но вдруг кто-то чего поумнее предложит... |
| Автор: Sunr1se 26.5.2006, 08:54 | ||
Есть такая идея: получать текущую дату и производить такие вычисления:
В результате получится действительно уникальное число... Хотя, можно еще секунды и миллисекунды прибавлять. |
| Автор: Yanis 26.5.2006, 09:17 |
| Может просто IntToStr(GetTickCount)+'.txt'? |
| Автор: Snowy 26.5.2006, 09:24 | ||
| Yanis, не самый надежный способ. И не удовлетворяет условию задачи. Т.к. порядок получится вообще какой попало в зависимости от перезагрузки системы.
Добавлено @ 09:24 Более поздние файлы должны идти по списку раньше. Добавлено @ 09:25 P.S. По дефолту, файндфёст будет находить файлы в порядке их создания, независимо от имени. |
| Автор: bems 26.5.2006, 09:34 | ||
|
| Автор: Snowy 26.5.2006, 09:39 |
| Ищи, добавляй в стринглист, сортируй - будет нужный результат. Добавлено @ 09:41 Как вариант - при добавлении нового файла, менять ему дату создания на более раннюю. Но не факт, что поможет. Я не проверял. |
| Автор: Yanis 26.5.2006, 09:50 |
Знаю, просто подумал, что может для простой задачи и так пойдёт. bems Почему бы вообще не завести свой тип файлов? |
| Автор: bems 26.5.2006, 09:53 |
| Именно так я и сделал. Ну а как это касается темы? Добавлено @ 09:55 В проекте SysUtils - роскошь, а ты про стринглист |
| Автор: Yanis 26.5.2006, 10:03 |
Я имею, что файлы юзера и файлы твоей программы пересекаются. Может можн как то разграничить? В отдельные папки например... |
| Автор: Yanis 26.5.2006, 10:13 |
| Тогда просто создавай файл - список нужных тебе файлов. И чужие файлы в этот список уже никак не влезут... |
| Автор: bems 26.5.2006, 10:20 |
| Усложняет все. Этот файл индекса уже не назовешь произвольно - нужно ж его как-то отличать от других. Поэтому придется делать предположение, что хотя бы такого имени еще нет. |
| Автор: Snowy 26.5.2006, 11:04 |
| Ну с уникальностью ясно. Вопрос с упорядочиванием файлов. Тебе нужен последний созданный файл или список файлов, упорядоченных по дате создания? Если первое, то просто беги файндфёстом и бери последний. Если второе, то беги фаёндфёстом и организуй стек из имен файлов. Потом для работы просто доставай из стека по одному. |
| Автор: bems 26.5.2006, 14:56 | ||
|
| Автор: Snowy 26.5.2006, 15:26 |
| Но построить стрек имен файлов ведь недолго. Для этого их совсем не нужно открывать. Кроме того, если в имени файла уже заложена дата, то не нужно открывать все - можно сориентироваться по имени или дате создания. |
| Автор: bems 26.5.2006, 17:46 | ||
Добавлено @ 17:50 И то не точно. Думаю добавить CRC |
| Автор: Snowy 26.5.2006, 17:59 |
| Зачем. Просто создай своё персональное расширение для своих файлов. Например '5123482835.ItsFileOfMyCoolProgram' Или в конце концов создай GUID и используй его, как собственное расширение. Файлов с расширением A8D329BD7C8B4E1DB88F3876B602EF64 точно не бывает. |
| Автор: bems 26.5.2006, 18:04 | ||
Уже сделал.
|
| Автор: Snowy 26.5.2006, 18:13 |
| Главное, что в стандартных условиях большинство файлов сразу отсеится. А в нестандартных - юзер сам виноват. Проверку нуно делать перед использованием конкретного файла. Проверять все - незачем. |
| Автор: Mechanic 26.5.2006, 23:51 | ||||
Как бы ни ухищрялся, всегда найдётся изобретательный идиот, который сделает именно то, о чем ты не подумал. Проще в описании программы написать "в папке данных программы нельзя создавать / изменять / удалять / переименовывать файлы". Никто ведь Биллу не дотумкается выставить счет, если при удалении случайных файлов пакета Microsoft Office, тот случайно перестанет работать. А защитить файлы можно просто раздачей прав на папку (NTFS rules).
Не знаю. Если бы меня попросили реализовать нечто подобное, я бы полностью абстрагировался от этих "изобретательных идиотов", и сделал бы диапазон дат лога в его имени. Типа ГГГГММДДЧЧММСС_ГГГГММДДЧЧММСС.MyExt тогда бы поиск файлов был бы простым перебором всех имен. Просто в этом случае нужно было бы проверять корректность системных часов (да хоть при запуске), чтоб не было запусков "в прошлом". И уж если очень захотелось бы быть уверенным в целостности файла, то прикрутил бы к нему какой-нить хэш в конце (типа CRC, SHA1 etc, только чуть подкриптованных и измененных, чтоб отсеять и очень изобретательных идиотов |
| Автор: bems 27.5.2006, 13:28 | ||||||||
Используются на другой машине. Что, отправлять кучу лишнего, а там уже разбираться? Дорорговато...
Очень изобретательные еще что-нибудь придумают, но защититься от скопированного и переименованого моего же файла нужно. |
| Автор: Mechanic 27.5.2006, 15:26 | ||
Тогда нужно хэш тулить уже в имя файла. |
| Автор: bems 27.5.2006, 16:05 |
| Спасибо, ребята. Останавливаюсь на следующем: 1. Файлы называются ггггммддччммссс.gsrtrs5ysrwrevthh.ext где ггггммддччммссс время ПЕРВОГО сообщения в логе, а gsrtrs5ysrwrevthh выбирается во время сохранения 2. Вхедере оставляю и время первого и время последнего сообщения. 3. При чтении директории для выбора очередности обработки игнорирую все после первой точки 4. Отправляю на тачку админа файлы, в имени которых есть дата и время после указанных в запросе клиентской части проги. 5. Открываю файл, предшествующий по дате и времени (тех что в имени) первому отправленному и проверяю на частичное соответствие запросу. Если запрошенная клиентом дата где-то в середине этого файла, то отправляю и этот. Думаю, тема закрыта. Если есть замечания по поводу этой схемы, то прошу... |
| Автор: Mechanic 27.5.2006, 17:11 | ||
По какому принципу? И есть ли фильтрация по именам до открытия файлов и чнения хедеров? Представим, я тупой юзверь, и запустил вот такую программу:
Админ асилит стока файлов? |
| Автор: Snowy 27.5.2006, 17:17 |
| Просто нужно еще на стороне клиента проверять - правильный файл или нет. |
| Автор: bems 27.5.2006, 17:33 | ||||||
админ - не знаю, сетка - с трудом
|
| Автор: Mechanic 28.5.2006, 19:57 |
Я ж совсем другое предлагал.. Предлагал ввести CRC в имя, чтоб валидность его можно было проверить, не открывая файл. Вот, накропал пример. Там использовал чуть измененный CRC32 - изменил сам полином, и начальное число. Плюс ещё данные XOR'ю ключом. Не думаю, что найдется у вас юзверь, что этот хаш сможет сгенерить без ковыринга в сорцах. Вот образцы валидных сгенеренных имен. 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, 21:15 |
| Нема за що. Тема просто интересная. Добавлено @ 21:25 |