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

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

Ка узнать полный путь файла? [D5, Win95/98, WinME]


bent ©   (2002-11-10 06:56:00) 

Ка узнать полный путь файла если имеется короткий? Есть такая функция GetFullPathName, дык чё-то не работает. Может быть есть какая-нибудь альтернатива этой функции? А межет быть я чё-то не так делаю?


Dimka Maslov   (2002-11-11 12:59:00) [1]

>Song
Пушка работает только под 95 виндой, в которой нет апи функции GetLongPathName, в более поздних версиях эта функция имеется, и именно она и вызывается


Song   (2002-11-11 09:08:00) [2]

Пушкой по воробьям... :)


bent   (2002-11-11 07:12:00) [3]

Во!


Danger   (2002-11-11 00:23:00) [4]

Вот по моему оптимальный вариант для этого:
function GetLongName(const FileName: string): string;
var
GetLongPathName: function (pszShortName, pszLongName: PChar;
cchBuffer: Integer): Integer stdcall;
Handle: HINST;
Buffer: array[0..MAX_PATH-1] of AnsiChar;

function InternalGetLongName(FileName: string): string;
var
SearchRec: TSearchRec;
FindResult: Integer;
Path, S1, S2, SN: string;
begin
if (FileName = "") or
(GetFileAttributes(PChar(FileName)) = $FFFFFFFF) then begin
Result:="";
Exit;
end;
Path:=ExtractFilePath(FileName);
S1:=FileName;
Delete(S1, 1, 1);
if (Path<>"") and (S1<>":") and (S1<>"\") then begin
FindResult:=FindFirst(Path+"*.*", faAnyFile, SearchRec);
try
Result:=FileName;
SN:=ExtractFileName(FileName);
while FindResult = 0 do begin
S2:=SearchRec.Name;
if (SN = S2) or (SN = SearchRec.FindData.cAlternateFileName) then begin
Result:=InternalGetLongName(ExcludeTrailingBackslash(Path))+"\"+S2;
Break;
end;
FindResult:=FindNext(SearchRec);
end;
finally
FindClose(SearchRec);
end;
end else Result:=FileName;

end;

begin
Handle:=GetModuleHandle("kernel32.dll");
@GetLongPathName:=GetProcAddress(handle, "GetLongPathNameA");
if Assigned(GetLongPathName) then begin
if GetLongPathName(PChar(FileName), @Buffer[0], SizeOf(Buffer))<>0
then Result:=PChar(@Buffer[0]) else Result:=FileName;
end else Result:=InternalGetLongName(FileName);
end;


Song   (2002-11-10 16:39:00) [5]

:-) Дык у тебя же путь-то константой задан, вот и прибавь его сам в Caption. А если была бы не константа, тогда можно так:

Тогда можно так:
procedure TForm1.Button1Click(Sender: TObject);
var SR:TSearchRec;
FileName:String;
begin
FileName:="C:\Windows\bluela~1.bmp";
if FindFirst(FileName,faAnyFile,SR)=0 then
Caption:=ExtractFilePath(FileName)+SR.FindData.cFileName;
end;


bent   (2002-11-10 16:36:00) [6]

Есть короткий путь файла, типа C:\WINDOWS\РАБОЧИ~1\ТЕКСТО~1.TXT,
а надо C:\WINDOWS\Рабочий стол\Текстовый документ.txt


MBo   (2002-11-10 08:38:00) [7]

приведи пример, что есть, а что надо получить


bent   (2002-11-10 08:29:00) [8]

>MBo
>Тогда можно так:
>procedure TForm1.Button1Click(Sender: TObject);
var SR:TSearchRec;
>begin
>if FindFirst("C:\Windows\bluela~1.bmp",faAnyFile,SR)=0 then
> Caption:=SR.FindData.cFileName;
>end;

Этот код даст только полное имя файла, а мне нужен путь


Василий2   (2002-11-10 08:15:00) [9]

Зайди в FAR и поищи :))


MBo   (2002-11-10 08:13:00) [10]

Что-то у меня GetFullPathName не расширило имя ;(((

Тогда можно так:
procedure TForm1.Button1Click(Sender: TObject);
var SR:TSearchRec;
begin
if FindFirst("C:\Windows\bluela~1.bmp",faAnyFile,SR)=0 then
Caption:=SR.FindData.cFileName;
end;


MBo   (2002-11-10 07:33:00) [11]

Память выдели. Короткое имя - первый параметр


bent   (2002-11-10 07:27:00) [12]

GetFullPathName("pChar1", 123,"Короткое имя","pChar1");


MBo   (2002-11-10 07:22:00) [13]

> межет быть я чё-то не так делаю
Вероятно. Покажи, как делаешь


Наверх

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