2011-01-11 4 views
0

パーティションをロックし、TFileStreamを使用していくつかのファイルを書き込み、ロックを解除したいとします。 ロックとロック解除の方法が見つかりましたが、書き込み方法はわかりません。 は、これまでのところ、私のコードは次のとおりです。私が以前にロックしたパーティションに書き込む方法(Delphiを使用)

Const 
    FSCTL_LOCK_VOLUME = $00090018; 
    FSCTL_UNLOCK_VOLUME = $0009001C; 

var HLockedVol: THandle; 

implementation 

{$R *.dfm} 

function LockDrive(Drive: AnsiChar): Boolean; 
var 
    OldMode: UINT; 
    BytesReturned: Cardinal; 
begin 
    Result := False; 

    OldMode := SetErrorMode(SEM_FAILCRITICALERRORS); 
    try 
     HLockedVol := CreateFile(PChar(Format('\\.\%s:', [AnsiLowerCase(string(Drive))])), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, 
     OPEN_EXISTING, 0, 0); 
     if HLockedVol <> INVALID_HANDLE_VALUE then 
     begin 
     Result := DeviceIoControl(HLockedVol, FSCTL_LOCK_VOLUME, nil, 0, nil, 0, BytesReturned, nil); 
     end; 
    finally 
     SetErrorMode(OldMode); 
    end; 
end; 

function UnlockDrive: Boolean; 
var 
    OldMode: UINT; 
    BytesReturned: Cardinal; 
begin 
    Result := False; 

    OldMode := SetErrorMode(SEM_FAILCRITICALERRORS); 
    try 
     if HLockedVol <> INVALID_HANDLE_VALUE then 
     begin 
     try 
      Result := DeviceIoControl(HLockedVol, FSCTL_UNLOCK_VOLUME, nil, 0, nil, 0, BytesReturned, nil); 
     finally 
      CloseHandle(HLockedVol); 
     end; 
     end; 
    finally 
     SetErrorMode(OldMode); 
    end; 
end; 

私はHLockedVolを使用することを想定していますが、私は方法がわからない...

あなたは私を助けてくださいことはできますか? ありがとうございます。

+2

2つのファイルを書き込むためにボリュームをロックする目的は何ですか?ファイルレベルではなくセクタレベルでパーティション(またはボリューム)を低レベルで読み書きする場合は、ボリュームを開く必要があります。 –

+0

あなたはそれをロックしているように見えません。ハンドルがまだ開いている間に他の人がハンドルを開くことを許可します。 –

+0

Eugene Mayevski 'EldoS Corp:他のアプリケーションやWindowsが同時に書いていると、私のアプリケーションは失敗します。 To David Heffernan:私はUSBスティック/キーでテストしています。ファイルマネージャーでアクセスすることも、書き込むこともできません。しかし、あなたが言うことが真実なら、私にそれをロックするより良い方法を教えてください。 –

答えて

3

何かを開いてファイルハンドルを受け取りました。書き込むには、WriteFileを使用します。あなたがストリームにもっと慣れている場合は、THandleStreamの中にハンドルをラップすることができます。

ファイルを書き込んでいないことに注意してください。ディスクに直接書き込んでいます。の下にあります。 "ファイル"という概念が存在する抽象レベルです。その間に(ボリュームをロックしているため)通常のファイルに対してはI/Oを実行することはできません。

これはあなたが質問した質問に対する回答ですが、おそらくあなたの問題の解決策ではありません。あなたの問題を説明する新しい質問を投稿してください。あなたが今現在追求している解決策について心配しないでください。

+0

はい、私はそのハンドルを使用する必要があることを知っていますが、あなたが言ったように、私は普通のファイルを書いていません。新しい質問を投稿する前に、私は必要なものについてここで説明します:私の友人はダミーファイルでUSBスティック/キー/ hddの空き領域全体を満たすプログラムを作るように頼んだ。この方法は、ほとんどのウイルスから保護されます。しかし、時には私はいくつかの他のプログラム(またはOS)がそれに書き込んでいるので、書き込みエラーを得ることがあります。 –

+1

@ジョンどのように空き容量を見つけるつもりですか?このHANDLEへの書き込みを開始すると、ファイルシステムが破損します。空き領域を埋めるには、ファイルを作成し、書き込みを開始するまでシステムに書き込むようにしてください。 –

+0

@David私はこのためのAPI関数を持っています:GetDiskFreeSpaceEx。私はそのハンドルを書くことがファイルシステムを破壊することを知っていたので、私はこの質問をしました。 Fat16/Fat32の場合は、あなたのアイデアがうまくいくかもしれませんが(プログレスバーの表示が消えてしまいます)、NTFS上でファイルを作成するスピードは間違いありません。あなたは、プログラムとそのソースをhttp://www.mediafire.com/download.php?laa7zo7cj82njca –

関連する問題