function gfnsFileDriveGet(sFile:
WideString):
WideString;
//Unicode対応ExtractFileDrive。
const
lcs_DRIVEDELIM =
WideString(':');
lcs_PATHDELIM =
WideString('\');
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] = lcs_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] = lcs_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
//2文字以上。
//1文字以下の場合はドライブ名とはみなさない。
if (sFile[2] = lcs_DRIVEDELIM)
then begin
//C:〜など。
Result := lfns_DriveGet(sFile, 1);
end else if (sFile[1] = lcs_PATHDELIM)
and (sFile[2] = lcs_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] = lcs_DRIVEDELIM)
then begin
Result :=
lfns_DriveGet(sFile, 5);
end;
end else begin
//\\〜 UNC。
Result :=
lfns_UncGet(sFile, 3, li_Len);
end;
end;
end;
end;
パス名を返す関数。
function gfnsFilePathGet(sFile:
WideString):
WideString;
{
Unicode対応ExtractFilePath。
ドライブ名も含む。
末尾の'\'はつく。
ドライブ名のみの場合も'\'はつく。
ただしパスが空文字の場合のみ'\'はつかない。
}
var
i: Integer;
begin
Result := '';
if (sFile <> '')
then begin
for i := Length(sFile)
downto 1
do begin
if (sFile[i] = '\')
or (sFile[i] = '/')
then begin
Result := Copy(sFile, 1, i);
Break;
end else if (sFile[i] = ':')
then begin
Result := Copy(sFile, 1, i) + '\';
Break;
end;
end;
end;
end;
拡張子を返す関数。