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 63

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);
        }
    }

решения:

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

Как Sayse рекомендуется, вы можете попробовать установить переменную среды %TEMP% при запуске вашего приложения.

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

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