Я работаю над программой, которая будет читать в.lsp файле, читать, частично понимать и комментировать его, а затем записывать отредактированную версию обратно в тот же каталог с вложением.txt. Проблема, с которой я сталкиваюсь, заключается в том, что визуальная студия бросает ошибку "данный путь не поддерживается", когда я пытаюсь запустить программу, что, вероятно, связано с некоторым недосмотром с моей стороны. Может ли кто-нибудь обнаружить часть моего кода, которая приведет к тому, что путь к файлу станет недействительным?
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);
}
}
EDIT: переменная filepath выводится как "C:\Users\Administrator\Documents\All Code\clearspan-autocad-tools-development\Code\Lisp\heel.lsp"
Кроме того, ошибка возникает в строке, где я пытаюсь инициализировать StreamWriter и настраивать путь к файлу как файл.txt.
openFileDialog.FileName
возвращает полный путь к файлу, а не только его имя, как следует из функции.
Поэтому попытка объединить его с openFileDialog.InitialDirectory
делает строку в отличие от того, что вы ожидаете
Вы можете использовать метод расширения, чтобы изменить его тип файла вашего вывода
var txtFile = Path.ChangeExtension(openFileDialog1.FileName, ".txt");
openFileDialog.FileName
уже включает в себя путь, поэтому объединение его с openFileDialog.InitialDirectory
делает его таким, как C:\...\C:\...
что недопустимо.
Итак, просто используйте
var txtFile= Path.ChangeExtension(openFileDialog1.FileName, ".txt");
У вашего кода несколько проблем.
Обработка ошибок: вы, по-видимому, не знаете, в какой строке возникает ошибка из-за вашей обработки ошибок. Возможно, было бы полезно пойти без этого для отладки.
Looping: вы извлекаете весь входной файл в память, а затем перебираете каждую строку, чтобы записать его. Если файлы, которые будут обработаны, будут достаточно малы, это будет работать, но я бы переместил цикл foreach
за пределы блока, который читает файл.
String Parsing: Я рекомендую хранить путь и имя файла в переменных, а не просто ссылаться на элемент управления. Это сделает его более читаемым. Кроме того, System.IO.Path.Combine()
может помочь создавать пути, не беспокоясь о конкатенации строк.
В целом: вы можете захотеть реорганизовать это в метод с такой подписью:
void ProcessLispFile(string inputFile, string outputFile) { }