Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

ExtractShortPathName, только наоборот.   Найти похожие ветки 

 
NewDelphiUser   (2004-04-22 11:40) [0]

Существует ли функция, преобразующая ShortPathName в полный путь к директорию, то есть выполняющая обратное по отношению к ExtractShortPathName действие?


 
[lamer]Barmaglot ©   (2004-04-22 11:47) [1]

как это не странно GetFullPathName


 
Григорьев Антон   (2004-04-22 11:50) [2]

Есть системная функция GetLongPathName, но для неё требуется Win98, 2000 или выше. Если нужна совместимость с младшими версиями, можно воспользоваться функцией FindFirst: при поиске по короткому имени в структуре TSerachRec передаётся длинное имя.


 
Григорьев Антон   (2004-04-22 11:53) [3]


> [lamer]Barmaglot ©   (22.04.04 11:47) [1]
> как это не странно GetFullPathName


Ой ли? А если внимательнее MSDN почитать?


 
NewDelphiUser   (2004-04-22 12:13) [4]


> Григорьев Антон   (22.04.04 11:50) [2]


Да, видимо это решение, спасибо.


 
NewDelphiUser   (2004-04-22 12:34) [5]

К сожалению, ничего не получилось. В структуре TSerachRec не передается путь к файлу, а только его имя. Мне же нужен полный (не ДОСовский) путь.


 
NewDelphiUser   (2004-04-22 12:56) [6]

Кто-то может предложить решение?


 
DVM ©   (2004-04-22 13:01) [7]

function FileFullPath( const FileName: String ) : String;
var SFI: TShFileInfo;
   Src, S: String;
begin
 Result := "";
 Src := FileName;
 while Src <> "" do
 begin
   S := Parse( Src, "\" );
   if Result <> "" then
     Result := Result + "\";
   if (Result = "") and (Length( S ) = 2) and (S[ 2 ] = ":") then
     Result := S
   else
   begin
     ShGetFileInfo( PChar( Result + S ), 0, SFI, Sizeof( SFI ),
                    SHGFI_DISPLAYNAME );
     if SFI.szDisplayName[ 0 ] <> #0 then
       S := SFI.szDisplayName;
     Result := Result + S;
   end;
 end;
 if ExtractFileExt( Result ) = "" then
 // case when flag "Hide extensions for registered file types" is set on
 // in the Explorer:
   Result := Result + ExtractFileExt( FileName );
end;


 
DVM ©   (2004-04-22 13:02) [8]

Это из KOL


 
NewDelphiUser   (2004-04-22 13:10) [9]

А где код функции Parse(...)?


 
DVM ©   (2004-04-22 13:18) [10]


> А где код функции Parse(...)?

Там и где все остальное - в KOL


 
Григорьев Антон   (2004-04-22 13:27) [11]


> NewDelphiUser   (22.04.04 12:34) [5]
> К сожалению, ничего не получилось. В структуре TSerachRec
> не передается путь к файлу, а только его имя. Мне же нужен
> полный (не ДОСовский) путь.


Так директории тоже ищутся через FindFirst. Надо разбить исходную строку по именам директорий, вызвать FindFirst для  каждой из них, а потом то, что получилось, собрать в одну строку.


 
DVM ©   (2004-04-22 13:31) [12]


> > А где код функции Parse(...)?

Вот она то и разбивает строку по разделителям, как описал Григорьев Антон   (22.04.04 13:27) [11]


 
Dimka Maslov ©   (2004-04-22 13:56) [13]

http://delphibase.endimus.com/?action=viewfunc&topic=filenames&id=10054


 
[lamer]Barmaglot ©   (2004-04-22 14:06) [14]

Ну ладно если я ввязался в эту тему, то вот мой код, он одновременно и проще и сложнее чем у Димки Маслова... Зато без всяких итераций...


procedure TForm1.Button1Click(Sender: TObject);
var
 ppshf:        IShellFolder;
 lpItemID : PItemIDList;
 c:            Cardinal;
 d:            Cardinal;
 e:            Cardinal;
 Str:        array[0..Max_path] of Char;
begin
c:=0;
e:=0;
d:=SFGAO_FILESYSTEM;
SHGetDesktopFolder(ppshf);
ppshf.ParseDisplayName(form1.handle,nil,"c:\temp\HTreeV~1.txt",c,lpItemID,d);

ShGetPathFromIDList(lpItemID, Str);
Edit1.text:=str;

GlobalFreePtr(lpItemID);
ppshf._Release;

end;


Код делался на скорую руку, но вроде все ресурсы освободил и вроде работать должно во всех версиях виндовс.

P.S. Очень хотелось бы услышать мнение специалистов об этом коде...


 
VMcL ©   (2004-04-22 14:16) [15]

>>[lamer]Barmaglot ©  (22.04.04 14:06) [14]

>ppshf._Release;

Это, вроде, не надо. Delphi сам вызывает.

Переменная "e" - лишняя.


 
NewDelphiUser   (2004-04-22 15:22) [16]


> [lamer]Barmaglot ©   (22.04.04 14:06) [14]


> DVM ©   (22.04.04 13:01) [7]

Спасибо, все работает. Остановился на таком варианте:

function TfSettings.GetFullFileName(FileName: string): string;
var
   ppshf    : IShellFolder;
   lpItemID : PItemIDList;
   NumChars : Cardinal;
   Flags    : Cardinal;
   s        : array[0..MAX_PATH] of Char;
   P        : PWideChar;
begin
   NumChars:=Length(FileName);
   Flags:=SFGAO_FILESYSTEM;
   SHGetDesktopFolder(ppshf);
   P:=StringToOleStr(FileName);
   ppshf.ParseDisplayName(Application.Handle,nil,P,NumChars,lpItemID,Flags);
   ShGetPathFromIDList(lpItemID, s);
   SetString(Result,s,StrLen(s));
end;


 
[lamer]Barmaglot ©   (2004-04-22 17:45) [17]

Красиво!
Может положишь в базу функций Димки маслова...



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
14-1082439726
bar
2004-04-20 09:42
2004.04.11
Народ. Правда, что студентов лишат отсрочек от армии?


14-1079365212
Soft
2004-03-15 18:40
2004.04.11
За явку на экзамен без меча...


14-1079297724
Delphin
2004-03-14 23:55
2004.04.11
Просто интересное Интервью с бывшим сотрудником Microsoft..


3-1079433260
ламер2
2004-03-16 13:34
2004.04.11
TIBQuery


7-1075901785
voron
2004-02-04 16:36
2004.04.11
Определение даты создания файла!