2016-11-01 13 views
1

私の最後の試みでは、成功と書かれているが、視覚的にいくつかの文字をカットしているが、ファイル内のテキストのサイズが正確に同じサイズを持っているSysUtils.FileWrite APIを使用してtxtファイルに私のPCの名前を書きたいまるで文字列が視覚的に完成したかのように。SysUtils.FileWrite APIを使用してtxtファイルに書き込む方法は?

例:私のPCは "TESTE-PC"(二重引用符なし)と呼ばれています。文字列 "TESTE-PC"(二重引用符なし)は正確に8ビットですが、SysUtils.FileWriteは "TEST"のみ書き込み、その後のファイルサイズは8ビットです。非常に奇妙な! :(

はどんな提案をいただき、ありがとうございます。

uses 
Registry; 

... 

function GetCompName: string; 
var 
    Reg: TRegistry; 
begin 
    Reg := TRegistry.Create; 
    try 
    Reg.rootKey := HKEY_LOCAL_MACHINE; 
    if Reg.OpenKey('SYSTEM\CurrentControlSet\Control\ComputerName\ActiveComputerName', false) then 
    begin 
     Result := Reg.ReadString('ComputerName'); 
     Reg.CloseKey; 
    end; 
    finally 
    Reg.Free; 
    end; 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
hFile: THandle; 
Str: PWideChar; 
begin 

if not fileexists('test.txt') then 
begin 
    Str := PWideChar(GetCompName); 
    hFile:= CreateFile('test.txt', GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0); 
    FileWrite(hFile, Str^, Length(Str)); 
    CloseHandle(hFile); 
end; 

end; 
+0

使用するエンコード方法は? –

答えて

0

変更strの種類をRawByteString代わりにPWideChar

procedure TForm1.FormCreate(Sender: TObject); 
var 
    hFile: THandle; 
    sFileName: string; 
    Str: RawByteString; 
begin 
    Str := PWideChar(GetCompName); 
    sFileName := 'Test.txt'; 
    if fileExists(sFileName) then 
     hFile := fileOpen(sFileName,fmOpenReadWrite) 
    else 
     hFile := fileCreate(sFileName); 
    try 
     FileWrite(hFile, 
     PChar(Str)^, Length(Str)); 
    finally 
     FileClose(hFile); 
    end; 
end; 
+0

これはRawByteStringを使用する方法ではありません。ここで使用しようとしているエンコードは何ですか? –

0

にあなたが広い文字を書くために必要がある場合は、にそのサイズを取りますアカウント:

FileWrite(hFile, Str^, Length(Str) * SizeOf(Char)); 
4

まず、レジストリを使用してコンピュータ名を取得するのが間違っています。代わりにGetComputerName()機能を使用する:あなたは正しく文字エンコーディングを処理していないので、

uses 
    Windows; 

... 

function GetCompName: string; 
var 
    CompName: array[0..MAX_COMPUTERNAME_LENGTH] of Char; 
    Size: DWORD; 
begin 
    Size := Length(CompName); 
    if GetComputerName(CompName, Size) then 
    SetString(Result, CompName, Size-1) 
    else 
    Result := ''; 
end; 

第二に、あなたのFileWrite()コードが失敗します。 FileWrite()は生のバイトのみで動作しますが、Unicode文字列を使用していて、SizeOf(WideChar)が2であることを考慮していないため、コードで想定されているように1ではありません。

また、RTLのFileCreate()関数をFileWrite()で使用する必要があります。 Win32 CreateFile()関数を直接使用する場合は、Win32 API WriteFile()も直接使用する必要があります。

ファイルの書き込み方法を問わず、相対パスではなくファイルへの絶対パスを使用する必要があります。上記のコードはUTF-16エンコーディングでファイルを作成すること

procedure TForm1.FormCreate(Sender: TObject); 
var 
    FileName: string 
    hFile: THandle; 
    Str: string; 
begin 
    FileName := 'C:\path to\test.txt'; 
    if not FileExists(FileName) then 
    begin 
    Str := GetCompName; 
    hFile := FileCreate(FileName); 
    if hFile <> INVALID_HANDLE_VALUE then 
    begin 
     FileWrite(hFile, PChar(Str)^, Length(Str) * SizeOf(Char)); 
     FileClose(hFile); 
    end; 
    end; 

注:

このようなより多くのものを試してみてください。

procedure TForm1.FormCreate(Sender: TObject); 
var 
    FileName: string; 
    hFile: THandle; 
    Str: UTF8String; 
begin 
    FileName := 'C:\path to\test.txt'; 
    if not FileExists(FileName) then 
    begin 
    Str := UTF8String(GetCompName); 
    hFile := FileCreate(FileName); 
    if hFile <> INVALID_HANDLE_VALUE then 
    begin 
     FileWrite(hFile, PAnsiChar(Str)^, Length(Str)); 
     FileClose(hFile); 
    end; 
    end; 

またはそのことについては、他のエンコーディング:

procedure TForm1.FormCreate(Sender: TObject); 
var 
    FileName: string; 
    hFile: THandle; 
    Enc: TEncoding; 
    Str: TBytes; 
begin 
    FileName := 'C:\path to\test.txt'; 
    if not FileExists(FileName) then 
    begin 
    Enc := TEncoding.GetEncoding('desired encoding'); 
    try 
     Str := Enc.GetBytes(GetCompName); 
    finally 
     Enc.Free; 
    end; 
    hFile := FileCreate(FileName); 
    if hFile <> INVALID_HANDLE_VALUE then 
    begin 
     FileWrite(hFile, PByte(Str)^, Length(Str)); 
     FileClose(hFile); 
    end; 
    end; 

あなたが使用することを決定どのようなエンコーディング、簡単な解決策でしょうあなたの代わりにUTF-8を使用したい場合は、次のようになります

uses 
    IOUtils; 

procedure TForm1.FormCreate(Sender: TObject); 
var 
    FileName: string; 
begin 
    FileName := 'C:\path to\test.txt'; 
    if not FileExists(FileName) then 
    begin 
    TFile.WriteAllText(FileName, GetCompName, TEncoding.UTF8); // or TEncoding.Unicode, etc... 
    end; 
end; 
関連する問題