2013-04-12 2 views
3

Я пытался написать код, чтобы я мог записывать сообщения об ошибках. Я пытаюсь назвать файл с датой и хотел бы создать новый файл журнала для каждого дня. Пройдя через небольшой взгляд вокруг, я пришел со следующим кодом ...System.UnauthorizedAccessException при создании файла

class ErrorLog 
{ 
    public void WriteErrorToFile(string error) 
    { 
     //http://msdn.microsoft.com/en-us/library/aa326721.aspx refer for more info 
     string fileName = DateTime.Now.ToString("dd-MM-yy", DateTimeFormatInfo.InvariantInfo); 

     //@ symbol helps to ignore that escape sequence thing 
     string filePath = @"c:\users\MyName\mydocuments\visual studio 2012\projects\training\" + 
          @"discussionboard\ErrorLog\" + fileName + ".txt"; 

     if (File.Exists(filePath)) 
     { 
      // File.SetAttributes(filePath, FileAttributes.Normal); 
      File.WriteAllText(filePath, error); 
     } 
     else 
     { 
      Directory.CreateDirectory(filePath); 
      // File.SetAttributes(filePath, FileAttributes.Normal) 
      //Throws unauthorized access exception 
      RemoveReadOnlyAccess(filePath); 
      File.WriteAllText(filePath, error); 
     } 
    } 

    public static void RemoveReadOnlyAccess(string pathToFile) 
    { 
     FileInfo myFileInfo = new FileInfo(pathToFile); 
     myFileInfo.IsReadOnly = false; 
     myFileInfo.Refresh(); 
    } 

    /*Exception thrown: 
    * UnAuthorizedAccessException was unhandled. 
    * Access to the path 'c:\users\anish\mydocuments\visual studio 2012\ 
    * projects\training\discussionboard\ErrorLog\04\12\2013.txt' is denied. 
    */ 
} 

Я нашел форум, который обсуждался о подобной проблеме, но с использованием File.SetAttrributes (Filepath, FileAttributes.Normal) не не помогли ни RemoveReadOnlyAccess (включены в код выше). Когда я проверяю свойства папки, она имеет только чтение, но даже когда я отмечаю это, он возвращается снова. Я проверил разрешения на папку и за исключением специального разрешения, которое я не смог изменить, все разрешено. Любое предложение о том, как я должен действовать, будет оценено по достоинству. Why is access to the path denied? ссылка обсуждает подобную проблему, но я не смог заставить свою работу работать с предложениями, перечисленными там.

Спасибо, что нашли время, чтобы посмотреть на это.

+2

Является ли это услугой или приложением? Пользовательские права на каталог могут иметь какое-то отношение к нему - можете ли вы предоставить дополнительную информацию об инфраструктуре? Если это услуга, она работает как учетная запись домена или локальная учетная запись? – Charleh

+0

@Charleh - это часть приложения формы окна. Я планирую назвать этот метод во всех моих блоках catch. Что касается прав пользователя, если у него не было прав, если он также не смог создать папку.Он создал имя папки «ErrorLog» в указанном месте. Благодарю. – NoSaidTheCompiler

ответ

4

Вашего путь странно: «Мои документы» каталог должен быть «C : \ Users \ MyName \ Documents \»

Вы можете использовать среду для того, чтобы исправить это легко:

String myDocumentPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); 

Обратите внимание, что это будет доступ ко„Мои документы“папку пользователя, который работает ваш ехе.

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

Попробуйте это:

String fileName = DateTime.Now.ToString("d", DateTimeFormatInfo.InvariantInfo); 

String filePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 
    + @"\visual studio 2012\projects\training\discussionboard\ErrorLog\"; 
String fileFullName = filePath + fileName + ".txt"; 

    if (File.Exists(fileFullName)) 
    { 
     File.WriteAllText(fileFullName , error); 
    } 
    else 
    { 
     Directory.CreateDirectory(filePath); 

[...] 
    } 
} 
+0

Ya после того, как вы упомянули, это выглядело странным для меня. Однако, когда я укажу путь так же, как я это сделал, он может создать папку «ErrorLog», которая ранее не была там, проблема в том, что касается создания файла в этой папке. Любая идея, если я правильно делаю часть создания файла? – NoSaidTheCompiler

+0

еще одна обнаруженная ошибка;) Попробуйте мое решение – Xaruth

+0

Я пробовал то, что вы сказали, и это имело смысл для меня, но все равно та же ошибка. Кроме того, у меня первоначально были даты, преобразованные в строку в «dd/mm/yy», и «/» не разрешено в имени файла, поэтому я подумал, что это может быть проблемой, я изменил его на «mm-dd-yy», но это тоже не помогло. Любая идея, как я могу проверить/изменить разрешение учетной записи пользователя, которую я использую? – NoSaidTheCompiler

3

Некоторые возможные причины:

  • ваше приложение не работает под учетной записью, которая позволила получить доступ к этому путь/файл
  • файл быть заблокирован для записи (или, может быть, чтение тоже) каким-либо другим процессом

Первая ситуация может быть решена путем проверки того, в какой учетной записи выполняется процесс, и проверки того, что учетная запись имеет соответствующие права.

Другая ситуация может быть решена путем проверки какой-либо другой процесс, блокирующий файл (например, использовать инструменты, такие как «WhosLocking» или «ProcessExplorer»

+1

Спасибо за ваш ответ. Я уверен, что использую учетную запись пользователя с правами администратора. Если у него не было прав, должно ли это быть не так, как должно было не создать папку? Он создал папку, но не файл. Это новый файл, который должен создать приложение, поэтому я думаю, что это исключает возможность блокировки, не так ли? – NoSaidTheCompiler

1

я должен был запустить мое приложение в качестве администратора для того, чтобы писать в защищенные папки в C :. Например, если вы отлаживаете свое приложение в visual studio, щелкните правой кнопкой мыши на «C: \ Program Files (x86) \ Microsoft Visual Studio 12.0 \ Common7 \ IDE \ devenv.exe» и выберите «Запуск от имени администратора». Затем откройте свое решение. Мое приложение пыталось написать в корень c: \

Смежные вопросы