93

私の顧客の 1 人が、私の製品を使おうとすると例外が発生しました。発生した例外のコールスタックを取得しました。そのトップは次のとおりです。

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.__Error.WinIOError()
   at System.IO.Path.GetTempFileName()
   at System.Windows.Input.Cursor.LoadFromStream(Stream cursorStream)
   at System.Windows.Input.Cursor..ctor(Stream cursorStream)

これをグーグルで検索すると、%TEMP% フォルダーに 65535 個を超える一時ファイルがある場合にこの例外がスローされ、解決策は古い一時ファイルを単純に消去することであると述べているブログ投稿がたくさん見つかりました。お客様にそうしていただくようお願いすることはできますが、これは一時的な解決策にすぎない可能性があります。お客様が GetTempFileName を頻繁に呼び出す他のソフトウェアを定期的に実行している場合、問題が何度も再発する可能性があります。

%TEMP% フォルダーをプログラムでクリアすることはできません。これは、何らかの形で他の何かに損害を与える可能性があるためです。また、GetTempFileName を呼び出す (代わりに自分の一時フォルダーを使用する) ことは避けられません。これは、私ではなく WPF コードが呼び出しているためです。

これに対する恒久的な解決策はありますか?

更新: %TEMP% フォルダーがログ ファイルでオーバーフローする問題は、自分のコードが原因ではなく、顧客のマシン上の他のサード パーティ製アプリケーションが原因であることが確認されました。の実装も調べましたが、Cursor.LoadFromStream間違いではありません。一時ファイルを生成しますが、finallyブロックで削除します。

4

8 に答える 8

5

Cursor.LoadFromStream最後に使用したコードは次のとおりです。呼び出しが発生する前に、アプリの初期化コードパスの早い段階に配置します。

    private void WarnUserIfTempFolderFull()
    {
        string tempFile = null;
        try
        {
            tempFile = Path.GetTempFileName();
        }
        catch (IOException e)
        {
            string problem = "The Temporary Folder is full.";

            string message = "{ProductName} has detected that the Windows Temporary Folder is full. \n" + 
                             "This may prevent the {ProductName} from functioning correctly.\n" + 
                             "Please delete old files in your temporary folder (%TEMP%) and try again.";

            Logger.Warn(problem);

            MessageBox.Show(message, caption: problem);
        }
        finally
        {
            if (tempFile != null) File.Delete(tempFile);
        }
    }
于 2013-08-21T11:49:06.753 に答える
2

ソリューション:

  1. 正しいもの。非常に多くの一時ファイルを生成し、それらを削除していないアプリケーションを検出します。のようなユーティリティProcess monitorが役立ちます。次に、アプリケーションを修正するか、破棄します。はい、これはあなたのアプリケーションかもしれません。だからこそ、悪の根源を探知することをお勧めします。
  2. 最も簡単なもの。独自の一時ディレクトリを使用します。ファイルがコードから作成されている場合、これは役に立ちません。
  3. 最も醜いもの。アプリケーションから一時ディレクトリをクリアします。あなたは結果について完全に正しいです-別のアプリケーションを壊す可能性があります.
于 2013-08-21T07:11:22.503 に答える
1

Sayseが提案したように、アプリの起動時に %TEMP% 環境変数を設定してみてください。

Environment.SetEnvironmentVariable("TEMP", "<dir>");
于 2013-08-21T07:06:54.520 に答える