Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как перевести короткий путь к файлу в длинный? [D5, D6, Win95/98]


Arhangel ©   (2002-05-08 13:38:00) 

Т.е. надо перевести, например:"C:\Мои до~1\qqqqqq~1.exe" в "C:\Мои документы\qqqqqqqqqqqqqqq.exe"


Alx2   (2002-05-13 14:15:00) [1]

А, понял!
Потому-что не везде есть нужная функция :)


Alx2   (2002-05-13 14:12:00) [2]

А почему так длинно-то?


Dimka Maslov   (2002-05-13 13:55:00) [3]

Господа!
Не забывайте что есть UBPFD, там масса полезных примеров:
http://delphibase.endimus.com/?action=viewtopic&topic=filenames


Alx2   (2002-05-13 08:03:00) [4]

>DrVasko (08.05.02 18:05)
>А зачем GetFullPathName из длл вытаскивать.
Я ее не вытаскиваю :)
>Она вроде как в модуле Windows уже прописана?

Она-то прописана, а вот это - нет: (у меня D5)
@GetLongPathName := GetProcAddress(Handle, "GetLongPathNameA"

>Кроме того она только путь переводит.

Неправда. GetLongPathName имя файла тоже переводит. Проверил.


DrVasko   (2002-05-08 18:05:00) [5]

> Alx2
А зачем GetFullPathName из длл вытаскивать. Она вроде как в модуле Windows уже прописана?
Кроме того она только путь переводит. А для имени файла нужна FindFirstFile.


Alx2   (2002-05-08 14:29:00) [6]

А вот этот пример показывает как получить полный путь к временной директории исходя из ее короткого пути :)
(Дело в том, что GetTempPath дает путь в формате 8.3)

Procedure TForm1.Button14Click(Sender: TObject);
Var

Str, Str2 : String;
pch : PChar;

GetLongPathName: Function (ShortPathName: PChar; LongPathName: PChar;
cchBuffer : Integer): Integer Stdcall;
Handle : THandle;
Begin
SetLength(Str, 256);
SetLength(Str2, 256);
GetTempPath(256, PChar(Str));
Str := PChar(Str);
ShowMessage(Str);
Handle := GetModuleHandle("kernel32.dll");
If Handle = 0 Then exit;
@GetLongPathName := GetProcAddress(Handle, "GetLongPathNameA");
If Assigned(GetLongPathName) And
(GetLongPathName(PChar(Str), PChar(Str2), 256) <> 0) Then
Str2 := PChar(Str2)
Else Str2 := "???";
ShowMessage(Str2);
End;


Alx2   (2002-05-08 14:25:00) [7]

А вот теперь посмотрел и выяснил, что наврал.
Решение такое:

Procedure TForm1.Button14Click(Sender: TObject);
Var
Str2: String;
GetLongPathName: Function (ShortPathName: PChar; LongPathName: PChar;
cchBuffer : Integer): Integer Stdcall;
Handle : THandle;
Begin
SetLength(Str2, 256);
Handle := GetModuleHandle("kernel32.dll");
If Handle = 0 Then exit;
@GetLongPathName := GetProcAddress(Handle, "GetLongPathNameA");
If Assigned(GetLongPathName) And
(GetLongPathName("C:\Мои до~1\qqqqqq~1.exe" , PChar(Str2), 256) <> 0) Then
Str2 := PChar(Str2)
else Str2 := "???";
// - Результат в Str2
End;



Alx2   (2002-05-08 13:48:00) [8]

Сам не смотрел, извини, но, кажется вот это должно помочь.
DWORD GetFullPathName(

LPCTSTR lpFileName, // address of name of file to find path for
DWORD nBufferLength, // size, in characters, of path buffer
LPTSTR lpBuffer, // address of path buffer
LPTSTR *lpFilePart // address of filename in path
);


Arhangel   (2002-05-08 13:47:00) [9]

Нашел ответ в форуме, но он немного неточный, а вот и ответ:
В реестре надо написать в разделе \command myprog.exe "%L", тогда и имя файла будет полным и путь к ниму;)


Наверх

Титульная страница Поиск, карта сайта Написать письмо