ReadFileWinAPIで運試しをすることができます。共有読み取りオープンモードでは、最後のファイルバッファフラッシュでファイルの内容をこっそりと読み取ることができます。別のアプリケーション(プロキシー)がFILE_SHARE_READ共有モードでCreateFile WinAPIを使用してファイルを開いた場合、ReadFile APIを使用している限り、ファイルを開いて読み取ることができます。Standart LoadFromFileメソッドは、まだ共有用に開かれている場合はここでは機能せず、同じ「ロック」エラーが発生します。
しかし、ここに問題があります。バッファ、サイズ、およびハンドルを処理する必要があります...読み取り用にファイルにハンドルを割り当て、そのハンドルでファイルサイズを取得し、そのサイズで配列を設定する必要があります。その配列を読み取り、割り当て、その配列をメモに追加します。WinAPIの純粋な使用法。簡単なタスクのためのいくつかの仕事...
WinAPIでファイルを処理する方法の基本的な例を次に示します。
他のアプリケーションのファイルオープンプロセスの主な前提条件は次のとおりです。
var
Form1: TForm1;
logfile: Textfile;
h: THandle;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// AssignFile(logfile, 'c:\deneme.txt');
// Rewrite(logfile);
h := CreateFile('C:\deneme.txt', GENERIC_WRITE, FILE_SHARE_READ, nil,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
Timer1.enabled := true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Timer1.enabled := false;
// CloseFile(logfile);
CloseHandle(h);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
str: AnsiString;
p: pointer;
buf: array of ansichar;
written: cardinal;
begin
// Writeln(logfile, 'denemeStr');
str := 'denemeStr' + #13#10;
p := pansichar(str);
SetLength(buf, length(str));
move(p^, buf[0], length(str));
WriteFile(h, buf[0], length(buf), written, nil);
FlushFileBuffers(h);
end;
そして、それが読書のために共有されている場合、これはあなたがそれから読むことができる方法です:
procedure TForm1.Button1Click(Sender: TObject);
var
h: THandle;
buf: array of ansichar;
size, read: cardinal;
begin
Memo1.Lines.Clear;
// Memo1.Lines.LoadFromFile('c:\deneme.txt');
h := CreateFile('C:\deneme.txt', GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
size := GetFileSize(h, nil);
SetLength(buf, size);
ReadFile(h, buf[0], size, read, nil);
CloseHandle(h);
Memo1.Lines.Add(pansichar(buf));
end;
これがお役に立てば幸いです...