使用中のファイルを削除できるように、ロックを解除または削除するにはどうすればよいですか? 問題のファイルは、私自身のアプリケーションで使用されています。
具体的には、私のアプリケーションはフリーウェアの Zeos Lib を使用しています。データベースを開いて保存するとき、sqlite3.dll ファイルはアプリケーションと同じディレクトリになければ正しく動作しません。
アプリケーションを 100% スタンドアロンにしたいので、sqlite3.dll を RC_DATA としてプロジェクトに追加し、それを使用する必要があるときはいつでも (つまり、データベースを開くか保存するか)、アプリケーションと同じフォルダーに展開します。 . 開く操作または保存操作が完了したら、sqlite3.dll ファイルを削除したいと思います。そのファイルが存在することを誰も知らず、ライブラリの欠落などを心配する必要もありません。ライブラリをアプリケーション内に格納するというアイデアには、これを行う理由があります。アプリケーション (SQL) の機能の背後にあるものをエンドユーザーに知られたくないので、心配する必要もありません。ダイナミック リンク ライブラリがありません。)
問題は、sqlite3.dll を正常に抽出して操作に使用できることですが、(アプリケーションを閉じるまで) ファイルがアプリケーションによってロックされ、次のいずれかになります。
アプリケーションを閉じずに、sqlite3.dll ファイルを強制的にロック解除する
sqlite3.dll ファイルを強制的に削除します
もちろん、別の提案がない限り?
これを抽出して使用するサンプルを次に示します。私の部分から LoadLibrary などの直接呼び出しを行う必要はありません。sqlite3.dll がアプリケーションと同じディレクトリにある限り、Zeos Lib ユニットがこれを処理する必要があります。
procedure ExtractResource(ResName: String; Filename: String);
var
ResStream: TResourceStream;
begin
ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
ResStream.Position:= 0;
ResStream.SaveToFile(Filename);
finally
ResStream.Free;
end;
end;
//Open procedure
var
sFileName: String = ExtractFilePath(ParamStr(0)) + 'Sqlite3.dll';
if OpenDialog1.Execute then
begin
ExtractResource('RES_SQLITE3', sFileName);
... //process my database
...
... // finished opening database
if FileExists(sFileName) then
DeleteFile(sFileName);
end;
編集
私がやろうとしていることはあまり実用的ではないと思います.STATUS_ACCESS_DENIEDが以前にコメントしたように、これは良い考えではありません. 私は、自分がやろうとしていることを進めないことが最善であると判断しました。