Я работаю над программой, которая будет читать файл .lsp, читать его, частично понимать и комментировать его, а затем записывать отредактированную версию обратно в тот же каталог с вложением .txt. Проблема, с которой я сталкиваюсь, заключается в том, что Visual Studio выдает ошибку «Данный путь не поддерживается» при попытке запустить программу, что, вероятно, связано с некоторым недосмотром с моей стороны. Может ли кто-нибудь обнаружить часть моего кода, из-за которой путь к файлу станет недействительным?

Stream myStream = null;
OpenFileDialog openFileDialog1 = new OpenFileDialog();

openFileDialog1.InitialDirectory = @"C:\Users\Administrator\Documents\All Code\clearspan-autocad-tools-development\Code\Lisp";
openFileDialog1.Filter = "LISP files (*.lsp)|*.lsp|All files (*.*)|*.*";
openFileDialog1.FilterIndex = 2;
openFileDialog1.RestoreDirectory = true;
string loc;

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    try
    {
        if ((myStream = openFileDialog1.OpenFile()) != null)
        {
            using (myStream)
            {
                string[] lines = File.ReadAllLines(openFileDialog1.FileName);
                // saves the document with the same name of the LISP file, but with a .txt file extension
                using (StreamWriter sr = new StreamWriter(openFileDialog1.InitialDirectory + "\\" + openFileDialog1.FileName.Substring(0, openFileDialog1.FileName.Length - 4) + ".txt"))
                {
                    foreach (string line in lines)
                    {
                        sr.WriteLine(line);
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
    }
}

РЕДАКТИРОВАТЬ: переменная пути к файлу выглядит как "C: \ Users \ Administrator \ Documents \ All Code \ clearspan-autocad-tools-development \ Code \ Lisp \ heel.lsp"

Кроме того, ошибка возникает в строке, где я пытаюсь инициализировать StreamWriter и настроить путь к файлу в формате .txt.

1
Archer 19 Май 2014 в 22:40

3 ответа

Лучший ответ

openFileDialog.FileName возвращает полный путь к файлу, а не только его имя, как предполагает функция.

Поэтому попытка объединить его с openFileDialog.InitialDirectory делает строку не такой, какой вы ожидаете

Вы можете использовать метод изменения расширения, чтобы изменить тип файла вашего вывода.

var txtFile = Path.ChangeExtension (openFileDialog1.FileName, ".txt");

0
Wedge 19 Май 2014 в 19:21

openFileDialog.FileName уже включает путь, поэтому объединение его с openFileDialog.InitialDirectory делает его недопустимым путем, подобным C:\...\C:\....

Итак, просто используйте

var txtFile= Path.ChangeExtension(openFileDialog1.FileName, ".txt");
4
Thomas Weller 19 Май 2014 в 19:01

В вашем коде есть несколько проблем.

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

Зацикливание: Вы загружаете весь входной файл в память, а затем просматриваете каждую строку, чтобы записать его. Если обрабатываемые файлы достаточно малы, это сработает, но я бы переместил цикл foreach за пределы блока, который читает файл.

Анализ строки: Я рекомендую сохранять путь и имя файла в переменных, а не просто ссылаться на элемент управления. Это сделает его более читабельным. Кроме того, System.IO.Path.Combine() может помочь построить пути, не беспокоясь о конкатенации строк.

Общий: Вы можете преобразовать это в метод с такой подписью:

void ProcessLispFile(string inputFile, string outputFile) { }
0
David Crowell 19 Май 2014 в 18:52