昨日この質問をしましたが、現時点では何の回答も得られませんでした。
とにかく、私の新しいアプローチは、バックグラウンドで常に実行する小さなプログラムを作成し、アプリケーションによって使用されていない一時ファイルがあるかどうかを定期的にチェックすることです。
今回は、開いたファイルを格納するためのフォルダーをシステムの一時フォルダー内に作成します。
これはコードです:
private const uint GENERIC_WRITE = 0x40000000;
private const uint OPEN_EXISTING = 3;
private static void Main()
{
while (true)
{
CleanFiles(Path.GetTempPath() + "MyTempFolder//");
Thread.Sleep(10000);
}
}
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
private static extern SafeFileHandle CreateFile(string lpFileName, UInt32 dwDesiredAccess, UInt32 dwShareMode,
IntPtr pSecurityAttributes, UInt32 dwCreationDisposition,
UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile);
private static void CleanFiles(string folder)
{
if (Directory.Exists(folder))
{
var directory = new DirectoryInfo(folder);
try
{
foreach (var file in directory.GetFiles())
if (!IsFileInUse(file.FullName))
{
Thread.Sleep(5000);
file.Delete();
}
}
catch (IOException)
{
}
}
}
private static bool IsFileInUse(string filePath)
{
if (!File.Exists(filePath))
return false;
SafeHandle handleValue = null;
try
{
handleValue = CreateFile(filePath, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
return handleValue.IsInvalid;
}
finally
{
if (handleValue != null)
{
handleValue.Close();
handleValue.Dispose();
}
}
}
しかし、これには次の問題があります。
docx および pdf (Foxit Reader を使用) ファイルでは問題なく動作します。
txt ファイルは、メモ帳でまだ使用されている場合でも削除されますが、ファイルの内容はメモ帳で引き続き表示されるため、これで問題ありません。
実際の問題は、Windows フォト ビューアーなどのアプリケーションにあります。画像は WPV でまだ使用されている場合でも削除されますが、今回は画像が WPV から消え、画面に「読み込み中...」というメッセージが表示されます。
ファイルがまだアプリケーションによって使用されているかどうかを実際に検出する方法が必要です。