Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.87.156] |
|
Сообщ.
#1
,
|
|
|
Подскажите пожалуйста как программно поменять длиные имена пути по алгоритму кодировки МАФЕ
Например требется перевести туда и обратно Мои документы <-> МОИДОК~1 Письмо клиента на претензию.doc <-> ПИСЬМО~2.DOC Выручайте горю |
Сообщ.
#2
,
|
|
|
function ExpandPath(const Path: string): string; var Dir, Drive, Name: string; i, Count: Integer; Dirs: array [0..127] of string; Buffer: array [0..MAX_PATH - 1] of Char; FName: PChar; FD: WIN32_FIND_DATA; HDir: THandle; NxtFile: Boolean; begin Result := ''; SetString(Dir, Buffer, GetFullPathName(PChar(Path), SizeOf(Buffer), Buffer, FName)); Drive := ExtractFileDrive(Dir); Count := 0; for i := Low(Dirs) to High(Dirs) do begin if (Length(Dir) = 3) or (Length(Dir) = Length(Drive)) then Break; Name := ExtractFileName(Dir); Dir := ExtractFileDir(Dir); if Name <> '' then begin Dirs[Count] := Name; Inc(Count); end; end; if Count > 0 then Dir := Drive; Name := UpperCase(Dir); for i := Count - 1 downto 0 do begin Dir := Concat(Dir, '\', Dirs[i]); HDir := FindFirstFile(PChar(Dir), FD); if HDir = INVALID_HANDLE_VALUE then Exit; try NxtFile := FindNextFile(HDir, FD); finally Windows.FindClose(HDir); end; if NxtFile then Exit; if FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then Exit; Name := Concat(Name, '\', FD.cFileName); end; Result := Name; end; //from http://www.sources.ru/delphi/delphi_tfilefinder.shtml |
Сообщ.
#3
,
|
|
|
P.O.D, круто
Но вот так, думаю, будет попроще: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; function GetLongPathNameA(lpszShortPath, lpszLongPath: PChar; cchBuffer: DWORD): DWORD; stdcall; external kernel32; var Form1: TForm1; implementation {$R *.dfm} function ExpandFileName(Path: String): String; begin SetLength(Result, MAX_PATH); if GetLongPathNameA(PChar(Path), @Result[1], MAX_PATH) = 0 then RaiseLastOSError; Result := Trim(Result); end; procedure TForm1.Button1Click(Sender: TObject); var S: String; begin // Получаем полное имя S := ExpandFileName('C:\DOCUME~1\'); ShowMessage(S); // Получаем урезанное имя GetShortPathName(PChar(S), PChar(S), MAX_PATH); ShowMessage(S); end; end. |
Сообщ.
#4
,
|
|
|
Rouse_ Блин, а я помню, было что-то стандартное, только не мог вспомнить название
|
Сообщ.
#5
,
|
|
|
Цитата P.O.D @ а я помню, было что-то стандартное, только не мог вспомнить название Это еще что, я вот до сихпор не могу раздуплить почему GetShortPathName обьявлен в Windows.pas, а GetLongPathName нет |