System.IO.IOException: "файл существует" при использовании System.IO.Path. GetTempFileName() - разрешения?
один из моих клиентов получил исключение всякий раз, когда он пытался использовать мой продукт. Я получил callstack исключения, которое произошло, верхняя часть которого:
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 (и вместо этого использовать свою собственную папку temp), поскольку это не я, а код WPF, который его вызывает.
есть ли постоянное решение для это?
обновление: я подтвердил, что проблема, когда папка %TEMP% переполнена файлами журнала, не вызвана моим собственным кодом и должна быть вызвана каким-либо другим сторонним приложением на машине клиента. Я также посмотрел на реализацию Cursor.LoadFromStream
и это, конечно, не ошибка - он генерирует временный файл, но затем удаляет его в finally
блок.
6 ответов:
важно что вы получаете ввод пользователей в это, таким образом, это на свой страх и риск. В моей голове это что-то похожее.
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;
если это происходит с тобой на производственной среды или с приложением, которое вы не можете изменить, быстрое решение состоит в том, чтобы очистить папку Temp.
в зависимости от пользователя, который запускает приложение, которое вы должны либо
- пустой
C:\Windows\Temp
(для IIS или служб, работающих под
вот код, который я использовал в конце, и положить в начале моего приложения инициализации код-путь, перед любыми вызовами
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); } }
решения:
- правая. Определите, какое приложение создает так много временных файлов и не удаляет их. Утилиты вроде
Process monitor
должны помочь вам. Затем либо исправьте приложение, либо выбросьте его. И да, это может быть ваше заявление. вот почему я бы рекомендовал вам обнаружить источник зла.- самый простой. Используйте свой собственный временный каталог. Это не поможет, если файлы создаются с вашего код.
- самый уродливый. Очистите временный каталог из приложения. Вы абсолютно правы о последствиях - вы можете сломать другое приложение.
Как Sayse рекомендуется, вы можете попробовать установить переменную среды %TEMP% при запуске вашего приложения.
Environment.SetEnvironmentVariable("TEMP", "<dir>");