Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Вниз

Уникальное имя   Найти похожие ветки 

 
Михайлов Антон   (2003-06-07 02:30) [0]

Люди, как мне сгенерировать уникальное имя файла в заданной дерриктории???


 
Suntechnic   (2003-06-07 04:30) [1]

Какие требование предъявляются к имени? GUID пойдёт?


 
Михайлов Антон   (2003-06-07 04:32) [2]

GUID??? а что это? :)


 
Михайлов Антон   (2003-06-07 04:37) [3]

требований в общем то нету... просто чтобы имя было не слишком длинное и ну и естественно без знаков #$%^&*!@ и т.п. просто будут создаваться временные файлыпри работе программы и нужно чтобы эти временные файлы друг друга случайно не заменили :)


 
Suntechnic   (2003-06-07 06:14) [4]

Михайлов Антон © (07.06.03 04:37)
требований в общем то нету... просто чтобы имя было не слишком длинное и ну и естественно без знаков #$%^&*!@ и т.п. просто будут создаваться временные файлыпри работе программы и нужно чтобы эти временные файлы друг друга случайно не заменили :)


Ну если так, то GUID это именно то, что тебе надо. Обяъснять, что это такое мне лень, так что лучше сам почитай. Считай это просто уникальным 128 битовым числом, вероятность повторения которого стремиться к 0 :)

var guid : TGUID;
begin
CreateGUID(guid);
ShowMessage(GuidToString(guid));
end;



 
Anatoly Podgoretsky   (2003-06-07 11:09) [5]

GetTempFileName


 
Михайлов Антон   (2003-06-07 11:24) [6]

хмм... очень интересно! СПАСИБО!


 
Armen   (2003-06-08 15:01) [7]

function GenerateUniqueSessionName: string;
var
Chars: string;
I, J: Integer;
CharMap: array [0..61] of char;
const
IDLength = 32;
begin
randomize;
SetLength(Result, IDLength);
Chars := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Assert(Length(Chars) = Length(CharMap));
for I := Low(CharMap) to High(CharMap) do
begin
J := Random(Length(Chars));
CharMap[I] := Chars[J+1];
Delete(Chars, J+1, 1);
end;
for I := 1 to IDLength do
Result[I] := CharMap[Random(High(CharMap)+1)];
end;

Так я генерирую уникальные имена сессий в WebApplication.


 
DVM   (2003-06-08 15:38) [8]

function GetUniqueFilename(FileName: string): string;
var
Path, Name, Ext : string;
I, J, K : Integer;
begin
Result := FileName;
Path := ExtractFilePath(FileName);
if not DirExists(Path) then Exit;
Name := ExtractFileNameWoExt(FileName);
if Name = "" then
begin
if Path[Length(Path)] = "\" then
Path := Copy(Path, 1, Length(Path)-1);
FileName := Path;
Result := Path;
end;
Name := ExtractFileNameWoExt(FileName);
Ext := ExtractFileExt(FileName);

I := Length(Name);
for J := I downto 1 do
if not (Name[ J ] in [ "0".."9" ]) then
begin
I := J;
break;
end;
K := StrToInt(Copy(Name, I + 1, MaxInt));
while DirExists(Result) do
begin
Inc(K);
Result := Path + Copy(Name, 1, I) + IntToStr(K) + Ext;
end;
end;


 
Юрий Зотов   (2003-06-08 15:43) [9]

Вот не понимаю, зачем изобретать велосипеды, когда СПЕЦИАЛЬНО для этой цели (и ИМЕННО для этой цели) система предоставляет уже готовую функцию. См. Anatoly Podgoretsky © (07.06.03 11:09).



 
Yanis   (2003-06-08 15:56) [10]

To Юрий Зотов © (08.06.03 15:43)& Armen(08.06.03 15:01)&DVM © (08.06.03 15:38)
Вот и выходит что после таких извращений из Nortona Windows получается.


 
Fenik   (2003-06-08 16:07) [11]

Даже если б и не было спец. функции, то можно же было логически подумать: генерируем имя ("filedata" + IntToStr(i), к примеру); смотрим есть ли такой файл (FileExists), если есть - снова генерируем, если нет создаём с новым именем и юзаем. Всё.


 
Михайлов Антон   (2003-06-08 16:13) [12]

to Fenik
Хмм.. но тогда время для каждой следующей генерации имени будет увеличиваться, что не есть хорошо...


 
DVM   (2003-06-08 16:19) [13]


> Михайлов Антон ©

Я сомневаюсь, что в одной папке скопятся несколько миллионов файлов с похожими именами.
Цикл for до 1 000 000 выполняется очень быстро.
Попробуй сам проверить.


 
Михайлов Антон   (2003-06-08 16:22) [14]

to DVM ©
Сморя на какой машине...
И ещё, цикл ведь будет не пустым... в этом цикле будут проверяться имена файлов, а значит использоваться винт, а значит тоже приведёт к увеличению времени генерации :)


 
DVM   (2003-06-08 16:29) [15]


> Михайлов Антон ©

Конечно от машины зависит, но я не думаю, что этой машиной будет что-то ниже Pentium. То что я предложил работает довольно быстро и довольно интеллектуально. Примерно так как эксплорер дает имена ярлыкам и файлам скажем на рабочем столе (ярлык1 ярлык2 ярлык3). К папкам данная функция неприменима (для этого есть другая). Эксплорер делает почти также. Я экспериментировал: создавал сотни тысяч файлов и смотрел на задержку эксплорера при создании нового. Она тоже увеличивается с количеством файлов. Я думаю, если ребята их Майкрософт ничего лучшего не нашли, то это оптимальный путь.


 
Fenik   (2003-06-08 16:37) [16]

Для уменьшения времени можно имя генерировать так:
"filedata" + IntToStr(Random(100000))


 
Михайлов Антон   (2003-06-08 16:47) [17]

to DVM ©

> ак как эксплорер дает имена ярлыкам и файлам скажем на рабочем
> столе (ярлык1 ярлык2 ярлык3)

Я же не создаю ярлыки... мне нужна максимальная отдача от проги.. т.е. минимум шансов, что она сгенерирует существующее имя и будет повторять попытки, пока не "придумает" не существующее имя...
да и guid мне подошёл в общем-то :)

to Fenik
Отличная идея!
а можно ещё и "filedata"+IntToStr(Random(100000))+"-"+ IntToStr(Random(100000))+"-"+ IntToStr(Random(100000)) и вааще супир :)


 
DVM   (2003-06-08 16:53) [18]


> Михайлов Антон ©

Лучше GUID тогда. Совпадение очень маловероятно. Фактически невозможно. GUID + "некоторый постоянный текст" и на одной машине совпадения исключены.
Или Anatoly Podgoretsky © (07.06.03 11:09)


 
Fenik   (2003-06-08 17:21) [19]

2 Михайлов Антон:
Только не забудь Randomize в начале, а то будет всё время одно и тоже генерировать.


 
Armen   (2003-06-08 17:46) [20]

Бери текущее время с точностью в msec и преобразуй в filename.

Точно повторения не будет.


 
DVM   (2003-06-08 17:49) [21]


> Armen

маловероятно, конечно, но не факт, например, при переводе часов на летнее/зимнее время.


 
Armen   (2003-06-08 17:53) [22]

> DVM ©
Теоритически да.
Но попробуй в практике создать 2 file-а с точностью в мсек.?


 
Armen   (2003-06-08 17:56) [23]

+ Можно еще убедиться что файл не существует.

По моему быстрее не придумаешь.


 
DVM   (2003-06-08 18:07) [24]


> Но попробуй в практике создать 2 file-а с точностью в мсек.?

На жестком диске скорее всего не выйдет, у них время доступа порядка 5 ms, а на RAM диске, думаю получится.


 
Юрий Зотов   (2003-06-09 08:10) [25]

> Yanis © (08.06.03 15:56)

Думаю, Вы все же заблуждаетесь. Чтобы сделать Windows, нужно изобретать не велосипеды, а кое-что посерьезнее. А велосипеды надо просто ЗНАТЬ, и на этом знании сэкономить свое время для тех самых более серьезных изобретений. Иначе есть неплохой шанс потратить на разработку 10 лет и в результате получить "Windows" на двух колесах. То есть, двигающуюся со скоростью этого самого велосипеда и падающую от дуновения ветра.


 
AbrosimovA   (2003-06-09 08:33) [26]

Уникальное имя можно получить, если в качестве названия использовать текущую дату и время с точностью до секунды.
Например, "9 июня 2003 г.(17-05-01).txt"


 
Юрий Зотов   (2003-06-09 09:07) [27]

> AbrosimovA (09.06.03 08:33)

Причем это имя будет особенно уникальным, если сформировать его два раза подряд.

К тому же, без малейших гарантий, что такого файла в каталоге действительно нет.


 
grusty   (2003-06-09 09:13) [28]

А можно и так:

Name:=IntToStr(DateTimeToFileDate(Date()))


 
Anatoly Podgoretsky   (2003-06-09 09:18) [29]

grusty © (09.06.03 09:13)
Очень ценное предложение, не более одного файла в сутки :-)


 
AbrosimovA   (2003-06-09 09:29) [30]

Удалено модератором
Примечание: OffTopic


 
Anatoly Podgoretsky   (2003-06-09 09:53) [31]

Удалено модератором
Примечание: OffTopic


 
Юрий Зотов   (2003-06-09 10:29) [32]

Удалено модератором
Примечание: OffTopic


 
SibVRV   (2003-06-09 10:50) [33]

Михайлов Антон © (07.06.03 04:37)
требований в общем то нету... просто чтобы имя было не слишком длинное и ну и естественно без знаков #$%^&*!@ и т.п. просто будут создаваться временные файлыпри работе программы и нужно чтобы эти временные файлы друг друга случайно не заменили :)


Создай один файл с названием swap.xxx и просто в него все пиши и читай из него, а делать 1000 и более файлов глупо, так как на создание одного файла место потратишь гораздо меньше. И скорость твоей программы станет гораздо выше.


 
grusty   (2003-06-09 12:48) [34]

Удалено модератором
Примечание: OffTopic


 
Михайлов Антон   (2003-06-10 13:25) [35]

> SibVRV
Но это действительно нужно в отдельных файлах!
Ведь так проще юзеру отыскать, например, утеряный файл...
Это всё задуманно для восстановления... То есть если файл небыл сохранён или небыло "Сохранить файл? ->НЕТ", то он сохраняется как файл для восстановления... Да и при работе нужно постоянно сохранять и извлекать из сохранённого файла информацию, что не есть ГУД, когда в одном файле хранится инфа о нескольких файлах...



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.022 c
3-83926
GSVSerg
2003-06-03 18:34
2003.06.26
CheckBox в DBGrid


3-84013
xxxCrazyManxxx
2003-05-29 10:34
2003.06.26
Помогите с командой CONVERT


3-83998
off
2003-05-27 06:43
2003.06.26
Считаем баланс?


1-84322
And
2003-06-16 07:26
2003.06.26
Подскажите что лучше использовать?


3-83853
explorer
2003-05-28 13:16
2003.06.26
Обработка ошибки хранимой процедуры





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский