2012-03-02 3 views
3

Я создаю простое приложение C#, которое должно писать пользовательский ввод в файл.Ошибка C# и File.WriteAllText

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

Моя вторая проблема заключается в том, что если я использую что-то вроде:

File.WriteAllText(@"C:\Users\Public\settings.settings", message); 

я получаю следующее сообщение об ошибке:

System.Security.SecurityException: Request for the permission of type 
    'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, 
    Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. at 
    System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& 
    stackMark, Boolean isPermSet) at System.Security.CodeAccessPermission.Demand() 
     at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, 
    Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions 
    options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) 
    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, 
    FileShare share, Int32 bufferSize, FileOptions options, String msgPath, Boolean bFromProxy) 

    at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, 
    FileShare share, Int32 bufferSize, FileOptions options) 

    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize) 
    at System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding) 
    at System.IO.File.WriteAllText(String path, String contents, Encoding encoding) 
    at IMDBGrabber.frmSettings.writeToFile(String p) 
    The action that failed was: Demand 

    The type of the first permission that failed was: System.Security.Permissions.FileIOPermission 

    The Zone of the assembly that failed was: MyComputer 

Любые идеи?

+0

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

ответ

3

Щелкните правой кнопкой мыши по объекту project => и перейдите на вкладку «Безопасность». Снимите флажок «Включить параметры безопасности ClickOnce» и повторите попытку. Если проблема не устранена, снимите флажок только с вкладки «Подписывание».

+0

большое спасибо. что решило мою проблему. –

+0

Вау, не думаю будет работать, но сделал. Теперь выяснить, почему ..... –

+2

нет вкладки безопасности ... – hakan

5

Удивительно, но не все пользователи имеют доступ к "C:\Users\Public".

Попробуйте поместить файл в Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData) + "\\settings.settings";

Все пользователи должны иметь доступ на запись там.

Также рассмотрите возможность использования подпапки, специфичной для приложения.

0

Является ли ваш C: \ Users \ общедоступной папкой доступной для записи? Если это не так, убедитесь, что это так, потому что трассировка исключений сообщает вам, что существует исключение SecurityException (связанное с проблемами безопасности, как вы могли догадаться), и что предыдущее исключение было связано с файлом IO. Так что это скорее всего ваше приложение. (или пользователь, выполняющий его), не имеет прав на запись в этой папке.

+0

Это исключение безопасности, а не исключение IO. Это не имеет никакого отношения к тому, является ли папка доступной для записи. – Gabe

+0

Как я могу проверить, может ли пользователь писать? Есть ли другой способ хранить некоторые данные, чем записывать их в файл? –

+0

Я должен извиниться. Мои глаза мне не понравились, когда я увидел фразу: Тип первого разрешенного разрешения: System.Security.Permissions.FileIOPermission .. и, кроме того, экстраполяция того, что исключение, которое было выбрано, было связано с файлом IO, действительно является ошибкой. Мне очень жаль. –

1

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

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