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


Автор: z-END 20.6.2004, 09:31
Собственно имеется запись, одно из ее полей String[255] в которой хранится имя файла...
Отсюда возникает разумный вопрос, какова вероятность того что имя файла превысит 255 символов?
ЗЫ у себя на компе ненашел ниодного файла длиннее 255 символов. у кого нибудь есть? smile.gif

Автор: Serggggg 20.6.2004, 10:12
Само имя файла, ИМХО, вряд ли превысит 255 символов - это надо постараться задать FileName в размере более 1,5 SMS-сообщения. А вот если указывается полный путь к файлу, да еще и неплохая вложенность папок (уровней так 5-6) - может и не поместиться. Хороший пример - резалка CD - Nero BurningRom - он ругается, когда полный путь к файлу превышает 255 символов.

Автор: z-END 20.6.2004, 10:36
хм, ну я вообще-то об этом и говорил полное имя файла..
Если отметать сеть, просто на StandAlone-компе часто ли бывают такие случаи?!

Автор: Петрович 20.6.2004, 11:05
Цитата
Если отметать сеть, просто на StandAlone-компе часто ли бывают такие случаи?!

Да, особенно, если HDD большой и информация на нем хорошо структуированна (много вложенных папок, имена несут смысловую нагрузку поэтому длинные).

Автор: Cheba 20.6.2004, 11:17
А еще можно превысить если использовать монтирование дисков в папки под NTFS. Особенно если к самой папке путь в символов 100.

Автор: <Spawn> 20.6.2004, 11:21
nJIaKca.spb Так что используй просто string - записывать такую строку не намного сложнееsmile.gif

Автор: Serggggg 20.6.2004, 11:22
nJIaKca.spb, а увеличить размер поля записи можно? Или String[255]
- это принципиально?

Автор: <Spawn> 20.6.2004, 11:29
Serggggg string[255] - это, насколько я знаю, старые Паскалевские строки, предельный размер которых равен 255, т.к. записывается в хедере строки, т.е. в одном байте. А если использовать string, то будет использоваться указатель на строку -> запись чуть услознится, но зато размер до 2ГБ можешь писатьsmile.gif

Автор: -=::BlackCat::=- 20.6.2004, 11:43
таких случеев много, по крайне мере у меня навалом

Автор: Alex 20.6.2004, 12:04
А можно просто хранить короткий путь к файлу.

Код
function sfn(const LongName: String): String;
// Возвращает LongFileName преобразованное в соответствующее короткое имя
var i :Integer;
begin
 SetLength(Result,Length(LongName));
 i := GetShortPathName(pChar(LongName),pChar(Result),Length(Result));
 if  i > Length(Result)  then begin
   SetLength(Result,i);
   i := GetShortPathName(pChar(LongName),pChar(Result),Length(Result));
 end;
 SetLength(Result,i);
end;
// -----------------------------------------------------------------
function lfn(const ShortName: String): String;
// Возвращает ShortFileName преобразованное в соответствующее длинное имя
var
 GetLongPathName: function(lpszShortPath: PChar; lpszLongPath: PChar;
                           cchBuffer: DWORD): DWORD; stdcall;
 h: THandle;
 i: Integer;
begin
 Result:= ShortName;
 if Result = '' then Exit;
 h := GetModuleHandle(kernel32);
 if h = 0 then Exit;
 @GetLongPathName := GetProcAddress(h, 'GetLongPathNameA');
 if not Assigned(GetLongPathName) then Exit;
 SetLength(Result, MAX_PATH);
 i:= GetLongPathName(PChar(ShortName), PChar(Result), Length(Result));
 if i = 0 then Exit;
 SetLength(Result, i);
end;

Автор: z-END 20.6.2004, 15:04
Ну я так и поступил, создал две переменные:
Код
Path: string[255];
LogPath: string[255];
function GetPath:String;
function Setpath(const APath:String);
если длинна больше 255 то первые 255 заносятся в переменную Path, а остаток в LongPath, функция FullPath собирает ето чудо, а SetPath соответственно записывает..
ЗЫ надеюсь больше 510 символов таких путей уже в природе нетsmile.gif

Автор: youri 21.6.2004, 04:34
А почему ты не хочешь использовать string вместо string[255]?

Автор: Medved 21.6.2004, 07:36
Действительно, а чем тебе не нравяться динамические строки AnsiString? К тому же они совместимы с функциями API Win32. Если я не ошибаюсь, их длина может составлять до 2 Гб. А если ты задаешь длину строку не превышающую 255 символов, (т.е. String[255]) то дельфи воспринимает эту строку как ShortString.

Автор: Alex 21.6.2004, 07:50
На сколько я понимаю, человек пишет данные в типизированный файл и по этому просто не может использовать String

Автор: Петрович 21.6.2004, 08:15
А еще, можно создать array [1..2048] of char hehe.gif , или массу других извращений hehe.gif hehe.gif hehe.gif

Автор: Medved 21.6.2004, 08:48
Во, во, Петрович как всегда выкрутился smile.gif сразу видно, настоящий русский программист (под словом русский имеется ввиду CCCP). Только не используй динамические массивы, если хочешь записывать в типизированный файл.

Автор: Girder 21.6.2004, 09:07
Цитата
... пишет данные в типизированный файл

Типизированный файл - это хорошо(для новичка) и плохо(для реализации) - Но это моё мнение.
В свое время столько по имел с "Типизированными файлами" проблем.
Поэтому лудше используй String и свои обработчики записи и считывания, не забудь записывать в файл версию файла(т.е. формата данных в файле).

Автор: Alex 22.6.2004, 00:00
Цитата(Pegas @ 21.6.2004, 09:48)
Во, во, Петрович как всегда выкрутился smile.gif сразу видно, настоящий русский программист (под словом русский имеется ввиду CCCP). Только не используй динамические массивы, если хочешь записывать в типизированный файл.

я бы сказал, как всегда попал в точку smile.gif smile.gif smile.gif

Автор: Петрович 22.6.2004, 07:56
Цитата
Во, во, Петрович как всегда выкрутился

Наверное не донес smile.gif. Я то имел ввиду, что так можно, но это извращение.
Правильнее конечно будет наладить нормальную запись AnsiString. И вообще, лучше иметь не запись, а объект который умеет сам себя писать и читать. Причем, как правильно отметил Girder, в начало файла надо писать версию его структуры, тогда, при дальнейшем развитии программы не будет проблем с чтением "старых" файлов.

Автор: z-END 22.6.2004, 10:42
thumbs-up.gif спросил только часто ли бывает что длинна (полное имя) файла превышает 255 символов, а тут столько вариантов и советов! спасибоsmile.gif
Петрович про R/W объектов это хорошо когда объект сам по себе... а вот если он является частью части динамического массива, например:
Код
Type myType1 = Object;
        ...
      end;

Type myBigType1 = Object;
        private
          Items: Array of myType1;
         ...
        public
         procedure Add (Data: myType1);    
          ...
    end;
Type Body = Object
        private  
         Items: Array of myBigType1;
         ...
       public
        ...
  end;

то запись/чтение такого объекта "немного" усложнится... может конечно сказывается мой дурной тон программирования, но я очень часто использую такой вид структуры.
Когда объект содержит текстовую информацию, и известно, что его длинна влегкую привысит 255 символов, то тогда приходится использвать нетипизированный файл и ф-цию BlockWrite, но это в свою очередь влечет за собой то что в таком случае приходится все properties объекта записывать и считывать "вручную" (BlockRead - BlockWrite) что неочень удобно, т.к. в случае если мне вдруг понадобилось добавить какое ни будь свойство в объект, то приходится переписывать заново процедуру чтения/записи...
Согласитесь проще использовать Record и записать в такой-же нетипизированный файл, но таким способом:
Код
for i := 0 to MyObject.RecCount-1 do
begin
BlockWrite (someF, MyObject.RecVersion, SizeOf (TrecVersion));
BlockWrite (someF, MyObject.MyRecord[i], SizeOf (TmyRecord));
end

а считывать так:
Код
BlockRead (someF, MyObject.RecCount, SizeOf (Integer));
SetLength (MyObject.MyRecord, MyObject.RecCount);
for i := 0 to MyObject.RecCount-1 do
begin
BlockRead (someF, MyObject.RecVersion, SizeOf (TrecVersion));
case MyObject.RecVersion of
ver1101:
        begin
           BlockRead (someF, MyAlfa, SizeOf (TmyAlfa));
           Convert (MyAlfa, MyObject.MyRecord[i]);
        end;
ver1102:
        begin
           BlockRead (someF, MyBeta, SizeOf (TmyBeta));
           Convert (MyBeta, MyObject.MyRecord[i]);
        end;
ver1103:  BlockRead (someF, MyObject.MyRecord[i], SizeOf (TmyRecord));
end

и в этом случае уже не надо следить за тем какие данные используются (в ф-ции чтения/записи) а какие еще нет..

Автор: Петрович 22.6.2004, 15:18
Дабы не развивать здесь дисскусию о том кто как пишет, я соглашусь что приведенный выше способ тоже имеет право на жизнь. Хотя я предпочитаю объекты хранить не в массивах, а в коллекциях, ... ... ...

Автор: Medved 23.6.2004, 14:18
Цитата
И вообще, лучше иметь не запись, а объект который умеет сам себя писать и читать.

Может быть я не понял ответа, но хотел бы заметить, что объекты нельзя записывать в типизированный файл. Если конечно речь шла об этом.

Автор: Akina 23.6.2004, 14:33
Цитата
ЗЫ у себя на компе ненашел ниодного файла длиннее 255 символов. у кого нибудь есть?

Например у меня в "E:\Documents and Settings\Администратор\Мои документы" достаточно развесистая клюква подкаталогов с весьма некороткими русификованными названиями, документы тоже именуются не "DOC1.RTF" - так что там полные имена по 300-500 байт сплошь и рядом...

Автор: Петрович 23.6.2004, 22:37
Цитата
Если конечно речь шла об этом.

Тут взглянул наверх, и обнаружил что тема-то вообще не касалась записи файлов biggrin.gif
А что касается:
Цитата
Может быть я не понял ответа, но хотел бы заметить, что объекты нельзя записывать в типизированный файл.
то nJIaKca.spb в своем примере пользует BlockWrite что практически не отличается от использования tFileStream.

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