Текущий архив: 2004.04.11;
Скачать: CL | DM;
Вниз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;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.04 c