"Формат заданого шляху не підтримується."


103

У мене в веб-службі є такий код:

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

Чи може хтось допомогти мені вирішити проблему із цим повідомленням про помилку з рядка 2 коду.

Формат заданого шляху не підтримується.

Дозвіл на папку встановлюється для повного доступу для всіх, і це фактичний шлях до папки.

Точка розриву дала мені значення str_uploadpathяк C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Що з цим рядком не так?


Яка цінність fileName?
Джастін

Здається, що fileNameце порожньо.
Джеремі Макгі

Джастін, ти мав рацію. Значення від імені файлу мало C: / у імені. Саме це мене вбивало. Дякую.
Весь Блондин

Відповіді:


125

Замість того, щоб використовувати str_uploadpath + fileName, спробуйте використовувати System.IO.Path.Combineзамість цього:

Path.Combine(str_uploadpath, fileName);

який повертає рядок.


Помилка зараз: Помилка 4 Використання директиви щодо простору імен може застосовуватися лише до просторів імен; "System.IO.Path" - це тип, а не простір імен
All Blond

2
@All Blond поставте using System.IO;вище, потім очистіть str_uploadpath + fileNameі напишітьPath.Combine(str_uploadpath, fileName)

код виглядає, як показано нижче, та сама помилка: Формат заданого шляху не підтримується. string str_uploadpath = Server.MapPath (@ "/ UploadBucket / Raw /"); str_uploadpath = Path.Combine (str_uploadpath, fileName); FileStream objfilestream = новий FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
Весь Блондин

1
@ Спробуйте налагодити свій код. Поставте точку розриву на лінії точно перед лінією, яка викликає помилку (F9 у Visual Studio). Запустіть свою програму. Коли програма зупиняється на точці розриву, наведіть курсор миші на змінну str_uploadpath. Яка його цінність?

1
Я отримую шлях, який не підтримується на наступному шляху, чому? "C: \ Users \ Admin \ AppData \ Local \ Adobe \ Flash CS6 \ en_US \ Конфігурація \ CodeModel \ cm-cache \ SwcCache \ basemovie3.swc1272273593 \ library.swf" Якщо я вставити її в провідник, він відкриється нормально, але. Метод System.IO.File.ReadAllBytes NET видає цю помилку. Це, безумовно, вірний і точний шлях, так чому ж помилка?
Трайнко

51

Я бачу, що розробник з'ясував, що помилка сталася під час спроби зберегти ім'я файлу цілим шляхом. Насправді достатньо мати ":"ім’я файлу, щоб отримати цю помилку. Якщо ":"у вашому файлі може бути ім'я (наприклад, якщо у вашому файлі є штамп дати), переконайтеся, що ви замінили їх чимось іншим. Тобто:

string fullFileName = fileName.Split('.')[0] + "(" + DateTime.Now.ToString().Replace(':', '-') + ")." + fileName.Split('.')[1];

2
Це вирішило проблему, з якою у мене виникло ім’я файлу. Я додаю поточну дату і час до мого файлу, а також значення ":" змушують мою програму кидати помилку, на яку посилається ОП.
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());

Або навіть коротшеreturn string.Concat(s.Split(Path.GetInvalidFileNameChars()));
Yousha Aleayoub

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\")


Зазвичай URL-адреси мають нахилені косої риси, і MapPathвони досить розумні, щоб зрозуміти це в будь-якому випадку.
Джастін

@spender На @передній частині рядка є вхід, який уникає цих.
Джастін

2

Це була моя проблема, яка може допомогти комусь іншому, хоча це не було проблемою ОП:

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

Я визначив проблему, вивівши свій шлях до файлу журналу і виявив, що він не форматується правильно. Правильно для мене було досить просто:

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

1

Чи допомагає метод Path.Combine ? Це більш безпечний спосіб об'єднання файлових шляхів разом. Можливо, у нього проблеми зі з’єднанням шляхів разом


0

Я використовую (обмежений) Expression builder для змінної для використання в простому завданні файлової системи для створення архіву файлу в SSIS.

Це мій швидкий і брудний злом, щоб видалити колонки, щоб зупинити помилку: @ [Користувач :: LocalFile] + "-" + ЗАМІНА ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"


0

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


-1

Якщо значення - це URL-адреса, схожа на файл: // C: / будь-яке, використовуйте клас Uri для переведення до звичайного імені файлу:

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

Взагалі, використання наданого API - найкраща практика.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.