[解決済み] System.IO.IOException。System.IO.Path.GetTempFileName() で "The file exists" - 解決?
質問
ある顧客が、私の製品を使おうとすると例外が発生しました。私は発生した例外のコールスタックを取得し、そのトップは次のとおりです。
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% フォルダをクリアすることはできません。それは何らかの形で他のものを損傷する可能性があるからです。また、私ではなく WPF コードがそれを呼び出しているため、GetTempFileName の呼び出し (と代わりに自分の一時フォルダを使用) を避けることはできません。
これに対する恒久的な解決策はあるでしょうか。
アップデイト
: TEMP% フォルダがログファイルで溢れる問題は、私自身のコードが原因ではなく、顧客のマシン上の他のサードパーティアプリケーションが原因である必要があることを確認しました。また、実装を調べてみたところ
Cursor.LoadFromStream
の実装も調べてみましたが、確かにそれは誤りではありません。それは一時ファイルを生成しますが、それを削除するには
finally
ブロック内で削除しています。
どのように解決するのですか?
前回のコメントで述べたように、これを行う唯一の安全な方法は、ファイルを削除してもう一度試してほしいかどうかをユーザーに尋ねることだと思います。それは 必須 この方法は、ユーザー自身の危険にさらされています。私の頭の中では、そのようなものです。
public Stream GetStream(Stream cursorStream)
{
try
{
//getting stream
}
catch(IOE)
{
MessageBox.Show(this, "Unable to get stream, your temporary
folder may be full, do you want to try deleting
some and try again?");
if(yes)
try
{
//delete and try again
return GetStream(cursorStream);
}
catch(IOE)
{
//no luck
}
else
return null;
}
}
可能性があることを確認するためのオプションのチェックです。
Directory.EnumerateFiles(Path.GetTempPath(), "*", SearchOption.TopLevelOnly)
.Count() == ushort.MaxValue;
関連
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み] エンティティタイプ <type> は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】非静的メソッドはターゲットを必要とする
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] usingディレクティブはネームスペースの内側と外側のどちらを使うべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】Excel "外部テーブルが期待された形式ではありません。"
-
[解決済み】ASP.NET Core Dependency Injectionのエラーです。アクティブ化しようとしているときに、タイプのサービスを解決できません。
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み】「...は'型'であり、与えられたコンテキストでは有効ではありません」を解決するにはどうすればよいですか?(C#)
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】Linq 構文 - 複数列の選択