Я пытаюсь открыть файл, но по какой-то причине перед именем сервера ставится C:\, что неверно.
Я попробовал два разных способа:
void ParseLogFile(string serverName, string logName)
{
string lognameFull = logName + ".txt";
string partialPath = @"\build\logs\";
string combinedPath = "\\" + serverName + partialPath;
string filePath = Path.Combine(combinedPath, Path.GetFileName(logNameFull));
//one way:
StreamReader reader0 = File.OpenText(@"\mach31\"); //error:
System.IO.FileNotFoundException :
Could not find file 'C:\mach31\ (even if there was a filename here it wouldn't find it with the C)
//another way (moved cursor to run this and not the one above):
StreamReader reader = File.OpenText(filePath); //error:
System.IO.DirectoryNotFoundException: ' Could not find a part of the path
'C:\mach31\build\logs\SpinFileVersionStats.txt'.'
}
Поэтому независимо от имени файла, перед строкой ставится C:. Как мне запретить ему помещать туда C? Мне нужен полный путь к нашему серверу, в котором нет буквы C:.
Я посмотрел на открытый файл с полным UNC-путем Я думаю, мне не нужно делать то, что они делают. а также открыть файл но я делаю то же самое, что и они, но у них нет имени сервера, они используют C:.
Есть идеи, почему по умолчанию используется C: и как это исправить?
Path.Combine может состоять из нескольких частей: возможно, было бы лучше использовать это, чем конкатенацию строк.
Когда вы создаете путь, он пытается создать абсолютный путь, получить текущий каталог, который содержит абсолютный путь, начинающийся с C:\, а затем добавить к нему ваш путь. В Windows необходимо указать абсолютный путь.
@EmperorEto Я также пробовал \\ перед именем сервера. И на самом деле, комбинированная переменная пути, указанная выше, действительно показывает \\ в коде.
"\\" — это одиночный символ обратной косой черты.
В Windows одиночная обратная косая черта перед путем означает: «Относительный путь от корня текущего диска. Например: «\temp» — это то же самое, что «C:\temp» (при условии, что вы находитесь на диск С).
Если путь не определен как абсолютный, он будет рассматриваться как относительный к текущему рабочему каталогу. Если он начинается с обратной косой черты, путь является «корневым» и рассматривается как относительный к диску текущего рабочего каталога. Вот откуда взялся C:.
@AndrewMorton Я попробовал строку filePath = Path.Combine("\\" ,serverName, partsPath, logNameFull); и я вижу, что он удаляет имя сервера и добавляет C:, поэтому возникает эта ошибка: System.IO.DirectoryNotFoundException: 'Не удалось найти часть пути 'C:\build\logs\SpinFileVersionStats.txt'.'
@Michele распечатайте filePath или проверьте его значение в отладчике.
@n0rd - я попробовал строку filePath = Path.Combine("\\\\" ,serverName, partsPath, logNameFull); и путь к файлу отображается как filePath = "\\build\\logs\\SpinFileVersionStats.txt" и удаляется имя сервера
Спасибо за помощь! Я заставил его работать. Ответ ниже.





Я заставил его работать с методом uri:
string serverPath = @"\\\\" + serverName;
string logNameFull = logName + ".txt";
string partialPath = @"\build\logs\";
string combinedPath2 = partialPath + logNameFull;
Uri serverUri = new Uri(serverPath + combinedPath2);
string finalPath = serverUri.LocalPath;
StreamReader readerb = File.OpenText(finalPath);
Не нужно ли говорить
string combinedPath = @"\\" + serverName + partialPath;?