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

Вниз

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

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

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


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

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


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

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


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

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


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

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


 
Григорьев Антон   (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 почитать?


 
Григорьев Антон   (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:13) [4]


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


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


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

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


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

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


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

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


 
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: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


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

Это из KOL


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

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


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

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


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


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

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


 
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 для  каждой из них, а потом то, что получилось, собрать в одну строку.


 
Григорьев Антон   (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]


 
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


 
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. Очень хотелось бы услышать мнение специалистов об этом коде...


 
[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" - лишняя.


 
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;


 
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]

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


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

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



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

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

Наверх





Память: 0.53 MB
Время: 0.035 c
14-1082201835
VMcL
2004-04-17 15:37
2004.05.09
Расшифровки ^)


14-1080221105
IronHawk
2004-03-25 16:25
2004.05.09
Киевская встреча Мастаков в реале №8


1-1082482837
Yegorchic
2004-04-20 21:40
2004.05.09
Goto


1-1082622321
Liona
2004-04-22 12:25
2004.05.09
создание модуля


1-1082466351
-=DEV=-
2004-04-20 17:05
2004.05.09
Как програмно прокрутить ScrollBar в StringGrid ?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский