1

昨日この質問をしましたが、現時点では何の回答も得られませんでした。

とにかく、私の新しいアプローチは、バックグラウンドで常に実行する小さなプログラムを作成し、アプリケーションによって使用されていない一時ファイルがあるかどうかを定期的にチェックすることです。

今回は、開いたファイルを格納するためのフォルダーをシステムの一時フォルダー内に作成します。

これはコードです:

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 から消え、画面に「読み込み中...」というメッセージが表示されます。

ファイルがまだアプリケーションによって使用されているかどうかを実際に検出する方法が必要です。

4

2 に答える 2

1

あなたはできません。

「ファイルが別のプログラムによって使用されている」という黒魔術はありません。これは単に、他のプログラムがファイルへのハンドルを開いたことを意味します。

常にハンドルを開いたままにしておくアプリケーションもあれば、そうでないアプリケーション (メモ帳など) もあります。ファイルを開くと、メモ帳はファイルのハンドルを開き、開いたハンドルのおかげでファイル全体を読み取り、ハンドルを閉じて、ユーザーにバイトを読み取ります。

ファイルを削除しても、開いているハンドルはなく、ファイルを削除したことにメモ帳が気付くことはありません。

于 2013-06-24T11:57:10.973 に答える
0

このSOの質問を見てください

ここでは、アプリケーション名でアプリケーションを確認できます (簡単な方法):

 Process[] pname = Process.GetProcessesByName("notepad");
 if (pname.Length == 0)
    MessageBox.Show("nothing");
 else
    MessageBox.Show("run");
于 2013-06-24T11:54:52.157 に答える