«Формат данного пути не поддерживается».

103

В моем веб-сервисе есть следующий код:

string str_uploadpath = Server.MapPath("/UploadBucket/Raw/");
FileStream objfilestream = new FileStream(str_uploadpath +
                fileName, FileMode.Create, FileAccess.ReadWrite);

Может ли кто-нибудь помочь мне решить проблему с этим сообщением об ошибке из строки 2 кода.

Формат данного пути не поддерживается.

Разрешение на папку установлено на полный доступ для всех, и это фактический путь к папке.

Точка останова дала мне значение str_uploadpathas C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Что не так с этой строкой?

Все блондинки
источник
В чем ценность fileName?
Джастин
Похоже, fileNameпусто.
Джереми МакГи
Джастин, ты был прав. Значение из имени файла содержало C: / в имени. Вот что меня убивало. Спасибо.
All Blond

Ответы:

125

Вместо использования str_uploadpath + fileNameпопробуйте использовать System.IO.Path.Combine:

Path.Combine(str_uploadpath, fileName);

который возвращает строку.

Джастин
источник
Получил сообщение об ошибке: Ошибка 4 Директива using namespace может применяться только к пространствам имен; 'System.IO.Path' - это тип, а не пространство имен
All Blond
2
@All Blond поставьте using System.IO;выше, затем очистите str_uploadpath + fileNameи напишитеPath.Combine(str_uploadpath, fileName)
код теперь выглядит так, как показано ниже, та же ошибка: данный формат пути не поддерживается. строка str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Путь.Combine (str_uploadpath, fileName); FileStream objfilestream = новый FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
All Blond
1
@ Все попробуют отладить ваш код. Поместите точку останова в строке точно перед строкой, вызывающей ошибку (F9 в Visual Studio). Запустите вашу программу. Когда программа остановится на точке останова, наведите указатель мыши на переменную str_uploadpath. В чем его ценность?
1
Почему я получаю, что путь не поддерживается на следующем пути? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Configuration \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Если я вставлю его в проводник, он откроется нормально, но. Метод NET System.IO.File.ReadAllBytes вызывает эту ошибку. Это, безусловно, правильный и точный путь, так почему же ошибка?
Трийнко
51

Я вижу, что создатель обнаружил, что ошибка произошла при попытке сохранить имя файла с полным путем. На самом деле достаточно иметь ":"в имени файла, чтобы получить эту ошибку. Если это может быть ":"в имени вашего файла (например, если у вас есть отметка даты в имени файла), убедитесь, что вы заменили их чем-то другим. Т.е.:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];
Даниэль Хеденстрём
источник
2
Это устранило проблему с моим именем файла. Я добавляю текущую дату и время в свой файл, и значения ":" заставляли мою программу выдавать ошибку, на которую ссылается OP.
acedanger
1
Это часто происходит при использовании, Path.GetInvalidPathCharsно не так Path.GetInvalidFileNameChars, как это было со мной.
Seph
4
Спасибо! Вот почему публикация нескольких ответов - всегда хорошая идея.
Ник
31

Для меня проблема заключалась в невидимом для человеческого глаза "‪" символе встраивания слева направо .
Он застрял в начале строки (непосредственно перед 'D') после того, как я скопировал путь из вкладки безопасности свойств файла Windows.

var yourJson = System.IO.File.ReadAllText(@"D:\test\json.txt"); // Works
var yourJson = System.IO.File.ReadAllText(@"‪D:\test\json.txt"); // Error

Так что эти, на первый взгляд одинаковые, две линии на самом деле разные.

Олег Гришко
источник
21

Если вы пытаетесь сохранить файл в файловой системе. Path.Combine не является пуленепробиваемым, так как он не поможет вам, если имя файла содержит недопустимые символы. Вот метод расширения, который удаляет недопустимые символы из имен файлов:

public static string ToSafeFileName(this string s)
{
        return s
            .Replace("\\", "")
            .Replace("/", "")
            .Replace("\"", "")
            .Replace("*", "")
            .Replace(":", "")
            .Replace("?", "")
            .Replace("<", "")
            .Replace(">", "")
            .Replace("|", "");
    }

А использование может быть:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
ThiagoPXP
источник
Или даже корочеreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Юша Алеайуб
7

Среди прочего, что может вызвать эту ошибку:

В полной строке PathFile не может быть определенных символов.

Например, эти символы приведут к сбою функции StreamWriter:

"/"  
":"

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

AppPath = Path.GetDirectoryName(giFileNames(0))  
' AppPath is a valid path from system. (This was easy in VB6, just AppPath = App.Path & "\")
' AppPath must have "\" char at the end...

DateTime = DateAndTime.Now.ToString ' fails StreamWriter... has ":" characters
FileOut = "Data_Summary_" & DateTime & ".dat"
NewFileOutS = Path.Combine(AppPath, FileOut)
Using sw As StreamWriter = New StreamWriter(NewFileOutS  , True) ' true to append
        sw.WriteLine(NewFileOutS)
        sw.Dispose()
    End Using

Один из способов предотвратить эту проблему - заменить проблемные символы в NewFileOutS на безопасные:

' clean the File output file string NewFileOutS so StreamWriter will work
 NewFileOutS = NewFileOutS.Replace("/","-") ' replace / with -
 NewFileOutS = NewFileOutS.Replace(":","-") ' replace : with - 

' after cleaning the FileNamePath string NewFileOutS, StreamWriter will not throw an (Unhandled) exception.

Надеюсь, это избавит кого-то от головной боли ...!

Майкл Герман
источник
Ах, спасибо! Я сохранял файл со строкой даты ISO в имени, но он содержит недопустимое ":"! Спасибо!
Мейсон
3

Если вы получаете эту ошибку в PowerShell, скорее всего, это связано с тем, что вы используете Resolve-Pathдля разрешения удаленного пути, например

 Resolve-Path \\server\share\path

В этом случае Resolve-Pathвозвращает объект, который при преобразовании в строку не возвращает допустимый путь. Он возвращает внутренний путь PowerShell:

> [string](Resolve-Path \\server\share\path)
Microsoft.PowerShell.Core\FileSystem::\\server\share\path

Решение состоит в том, чтобы использовать ProviderPathсвойство объекта, возвращаемого Resolve-Path:

> Resolve-Path \\server\share\path | Select-Object -ExpandProperty PRoviderPath
\\server\share\path
> (Resolve-Path \\server\share\path).ProviderPath
\\server\share\path
Аарон Дженсен
источник
2

Попробуйте изменить:

Server.MapPath("/UploadBucket/Raw/")

к

Server.MapPath(@"\UploadBucket\Raw\")

JimSTAT
источник
URL-адреса обычно имеют косую черту и MapPathдостаточно умен, чтобы понять это в любом случае.
Джастин
@spender В начале строки есть символ, @который их экранирует.
Джастин
2

Это была моя проблема, которая может помочь кому-то другому, хотя это не было проблемой OP:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.ToString());

Я определил проблему, указав свой путь к файлу журнала и обнаружив, что он неправильно форматируется. Правильно для меня было довольно просто:

DirectoryInfo diTemp = new DirectoryInfo(strSomePath);
FileStream fsTemp = new FileStream(diTemp.FullName.ToString());
omJohn8372
источник
1

Помогает ли использование метода Path.Combine ? Это более безопасный способ объединения путей к файлам. Может быть, у него проблемы с соединением путей вместе

Курру
источник
0

Я использую (ограниченный) построитель выражений для переменной для использования в простой задаче файловой системы для создания архива файла в SSIS.

Это мой быстрый и грязный прием по удалению двоеточий, чтобы остановить ошибку: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"

Адам Ноэль
источник
0

Сегодня у меня была такая же проблема. Файл, который я пытался загрузить в свой код, был открыт для редактирования в Excel. После закрытия Excel код заработал!

Ряно
источник
-1

Если значением является URL-адрес файла, например file: // C: / something, используйте класс Uri для преобразования в обычное имя файла:

var localPath = (new Uri(urlStylePath)).AbsolutePath

В общем, использование предоставленного API - это лучшая практика.

Крис Бордеман
источник