Unicode対応ExtractFileDrive
Unicode対応ExtractFileDrive。
interface
function ExtractFileDriveW(sFile: WideString): WideString;
implementation
uses
SysUtils;
function ExtractFileDriveW(sFile: WideString): WideString;
{
Unicode対応ExtractFileDrive。
'\\?\'に対応。
}
function lfns_DriveGet(sDrive: WideString; iIndex: Integer): WideString;
begin
if (WideUpperCase(sDrive[iIndex])[1] in [WideChar('A')..WideChar('Z')]) then begin
Result := Copy(sFile, iIndex, 2)
end else begin
Result := '';
end;
end;
function lfns_UncGet(sDrive: WideString; iIndex, iLen: Integer): WideString;
//UNC名を返す。
var
i: Integer;
iServer: Integer;
begin
Result := '';
i := iIndex;
iServer := -1;
while (i < iLen) do begin
if (sDrive[i] = PathDelim) then begin
if (i = iIndex) then begin
Exit; //サーバー名が''
end else begin
if (iServer <> -1) then begin
if ((iServer + 1) = i) then begin
Exit; //共有フォルダ名が''
end else begin
Break;
end;
end else begin
iServer := i;
end;
end;
end;
Inc(i);
end;
if (iServer <> -1) and (iServer < iLen) then begin
if (sDrive[i] = PathDelim) then Dec(i);
Result := Copy(sDrive, iIndex, i - iIndex + 1);
if (Result <> '') then Result := '\\' + Result;
end;
end;
var
li_Len: Integer;
begin
Result := '';
li_Len := Length(sFile);
if (li_Len >= 2) then begin
if (sFile[2] = DriveDelim) then begin
//C:〜
Result := lfns_DriveGet(sFile, 1);
end else if (sFile[1] = PathDelim) and (sFile[2] = PathDelim) then begin
if (li_Len >= 8) and (WideUpperCase(Copy(sFile, 1, 8)) = '\\?\UNC\') then begin
//\\?\UNC\〜
Result := lfns_UncGet(sFile, 9, li_Len);
end else if (li_Len >= 3) and (sFile[3] = '?') then begin
//\\?\〜
if (li_Len >= 6) and (sFile[6] = DriveDelim) then begin
Result := lfns_DriveGet(sFile, 5);
end;
end else begin
//\\〜 UNC
Result := lfns_UncGet(sFile, 3, li_Len);
end;
end;
end;
end;
オリジナルのExtractFileDriveと違い、ドライブ文字の判定をきつくしています。
'A'〜'Z'(小文字も含む)以外の文字は空文字が返ります。
ls_Drive := ExtractFileDrive('1:\Abc.txt'); //ls_Drive は '1:'
ls_Drive := ExtractFileDriveW('1:\Abc.txt'); //ls_Drive は ''
上記のような場合、オリジナルのExtractFileDriveではls_Driveは'1:'になりますがExtractFileDriveWでは空文字になります。