Delphiは、WideStringを使用して、コンパイラでUnicodeをサポートします。
ただし、次の問題が発生します。
- Delphi <2009は、VCLでUnicodeをサポートしていません。
- 多くのAPIマッピングは、APIのANSI(たとえば、OpenFileA)バリアントで行われます。
- delphiコンパイラは、WideStringを文字列に大量に変換するため、それらについて非常に明確にします。
生のUnicodeウィンドウAPIを使用する場合に機能します。
したがって、FindFirstは、デルファイがFindFirstFileAバリアントにマップするAPI FindFirstFileを使用し、FindFirstWを直接呼び出す必要があります。
したがって、2つのオプションがあります。
- Delphi 2009にアップグレードして、多くのUnicodeマッピングを実行してください
テキストファイルの書き込みには、Primoz Gabrijelcic(別名gabr)のGpTextFileまたはGpTextSteamを使用できる場合があり、Unicodeをサポートしています。
彼女は、Unicodeファイル名でファイルを開く例です。
function OpenLongFileName(const ALongFileName: WideString; SharingMode: DWORD): THandle; overload;
begin
if CompareMem(@(WideCharToString(PWideChar(ALongFileName))[1]), @('\\'[1]), 2) then
{ Allready an UNC path }
Result := CreateFileW(PWideChar(ALongFileName), GENERIC_READ, SharingMode, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
else
Result := CreateFileW(PWideChar('\\?\' + ALongFileName), GENERIC_READ, SharingMode, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
end;
function CreateLongFileName(const ALongFileName: WideString; SharingMode: DWORD): THandle; overload;
begin
if CompareMem(@(WideCharToString(PWideChar(ALongFileName))[1]), @('\\'[1]), 2) then
{ Allready an UNC path }
Result := CreateFileW(PWideChar(ALongFileName), GENERIC_WRITE, SharingMode, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
else
Result := CreateFileW(PWideChar('\\?\' + ALongFileName), GENERIC_WRITE, SharingMode, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
end;
これらの関数を使用したのは、ANSI APIのパス制限が254文字であるためです。間違いがなければ、Unicodeのパス制限は2^16文字です。
ファイルへのハンドルを取得したら、通常のReadFile delphi apiマッピングを呼び出すだけで、ファイルからデータを読み取ることができます。