C # WriteDirectory Проблема - PullRequest
       14

C # WriteDirectory Проблема

0 голосов
/ 09 июля 2009

У меня есть приложение, которое пишет в папку на диске C: \. Программа отлично работает на моем компьютере, но на другом ноутбуке при запуске .exe (на другом ноутбуке нет визуальной студии и т. Д.), Я получаю исключение файла notfoundexception и не могу определить строку кода, где это происходит, из отчета об ошибке.

Вот код для создания каталога (при условии, что это проблема)

        try
        {
            WriteDirectory = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\SMS Notifier\");
            if (!WriteDirectory.Exists)
                WriteDirectory.Create();
        }
        catch (Exception e)
        {
            throw e;
        }

Есть идеи, в чем может быть проблема? Должен ли я проверить разрешение на запись?!

Помощь с благодарностью!

Ответы [ 6 ]

5 голосов
/ 09 июля 2009

Если вы развернете файлы .pdb вместе с вашими .dll, вы получите номера строк в сообщениях об исключениях!

Ваш try..catch блок не делает ничего полезного, все, что он делает, - глотает трассировку стека, чтобы вы не могли видеть, что происходит! Я бы предложил полностью удалить блок try..catch.

throw e; приводит к потере трассировки стека, используйте throw; для ее сохранения.

Также вы должны использовать System.IO.Path.Combine(), чтобы добавить корень каталога и имя подкаталога, чтобы вам не пришлось беспокоиться о том, чтобы сделать \ самостоятельно и, возможно, совершить ошибку.

2 голосов
/ 09 июля 2009

Я предполагаю, что это не настоящая проблема; ни DirectoryInfo.Create , ни Directory.CreateDirectory сгенерировать исключение FileNotFoundException.

Лучше всего построить приложение для отладки, а затем скопировать файл вместе со всеми его файлами .pdb; надеюсь, это даст вам методы и номера строк в вашем сообщении об ошибке.

Вы можете также рассмотреть возможность добавления обработчика для любого необработанного исключения; AppDomain.UnhandledException может быть обработан, так что вы можете добавить свой собственный обработчик событий для любого необработанного исключения, выполняющегося в любом месте приложения;

Добавьте что-то подобное в свою функцию Main;

 System.AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

А затем напишите свой собственный обработчик для ошибки;

static void MyHandler(object sender, UnhandledExceptionEventArgs args) {
   Exception e = (Exception) args.ExceptionObject;
   Console.WriteLine("MyHandler caught : " + e.Message);
}
1 голос
/ 09 июля 2009

Использование throw; вместо throw e; сохранит исходную трассировку стека в исключении.

Помещение Console.WriteLine(e.ToString()); (или эквивалента MessageBox) в блок catch будет время от времени выводить трассировку стека (вам потребуется отладочная сборка для большей информации).

Если ничего не помогает, поможет старый стандарт операторов трассировки Console.WriteLine("about to do x"); - приложение запускается из командной строки.

1 голос
/ 09 июля 2009

Первое, что я мог бы сделать (для целей отладки), это вставить

MessageBox.Show(WriteDirectory.FullName);

перед тем, как попытаться создать каталог, просто чтобы посмотреть, является ли этот "Особый" путь тем, чем вы думаете!

1 голос
/ 09 июля 2009

Существует ли этот путь на ноутбуке?

Environment.SpecialFolder.ApplicationData

Сделайте debug.writeline в этой строке как messagebox.show и посмотрите, какой путь? Также, если путь существует, это может быть проблема с разрешениями .. скорее всего

0 голосов
/ 09 июля 2009

.NET Framework установлен на ноутбуке?

другая возможность: Plateform не поддерживает этот каталог. Проверьте совместимые формы на MSDN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...