Подтвердить что ты не робот

System.IO.IOException: "Файл существует" при использовании System.IO.Path.GetTempFileName() - разрешений?

Один из моих клиентов получил исключение, когда пытался использовать мой продукт. Я получил столбец исключения, которое произошло, вершина которого:

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 файлов temp, и что решение состоит в том, чтобы просто очистить старые временные файлы. Я могу попросить клиента сделать это, но это может быть только временным решением - что, если они регулярно запускают какую-то другую часть программного обеспечения, которая часто вызывает вызовы GetTempFileName, что будет снова и снова повторять проблему?

Я не могу просто программно очистить папку% TEMP%, так как это может каким-то образом повредить что-то еще, и я не могу избежать вызова GetTempFileName (и вместо этого использовать собственную папку temp), поскольку это не я, а код WPF, который называя это.

Есть ли какое-либо постоянное решение для этого?

ОБНОВЛЕНИЕ. Я подтвердил, что проблема, при которой папка% TEMP% переполнена файлами журнала, не вызвана моим собственным кодом и должна быть вызвана каким-либо другим сторонним приложением на клиент машина. Я также рассмотрел реализацию Cursor.LoadFromStream и, безусловно, не виноват - он генерирует временный файл, но затем удаляет его в блоке finally.

4b9b3361

Ответ 1

Как я упоминал в своем последнем комментарии, я думаю, что ваш единственный безопасный способ сделать это - попросить пользователя, хотят ли вы удалить файлы и повторить попытку. Крайне важно, чтобы вы ввели пользователей в это, таким образом, это на свой страх и риск. В моей голове что-то похожее.

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;

Ответ 2

Вот код, который я использовал в конце, и поставил на раннем этапе мой код инициализации моего приложения, прежде чем появятся любые вызовы 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);
        }
    }

Ответ 3

В качестве Sayse вы можете попробовать установить переменную окружения% TEMP% при запуске приложения.

Environment.SetEnvironmentVariable("TEMP", "<dir>");

Ответ 4

Решения:

  • Правильный. Обнаружение приложения, которое производит так много временных файлов и не удаляет их. Такие утилиты, как Process monitor, должны вам помочь. Затем либо исправить приложение, либо выбросить его. И да, это может быть ваше приложение, поэтому я бы рекомендовал вам обнаружить источник зла.
  • Самый простой. Используйте свой собственный временный каталог. Это не поможет, если файлы создаются из вашего кода.
  • Самый уродливый. Очистите временную директорию от приложения. Вы абсолютно правы в отношении последствий - вы можете сломать еще одно приложение.

Ответ 5

Для всех, кто испытал эту проблему, и не может найти переполненную временную папку - Проверьте папку "C:/Windows/Temp". Очистка этой папки решила мои проблемы.