"지정된 경로의 형식은 지원되지 않습니다."


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무엇입니까?
Justin

fileName비어있는 것 같습니다 .
Jeremy McGee 2011 년

저스틴, 당신 말이 맞아요. filename의 값에는 이름에 C : /가 있습니다. 그것이 나를 죽이는 것입니다. 감사.
All Blond

답변:


125

str_uploadpath + fileName사용하는 System.IO.Path.Combine대신 다음을 사용해보십시오 .

Path.Combine(str_uploadpath, fileName);

문자열을 반환합니다.


지금 오류가 발생했습니다 : 오류 4 using namespace 지시문은 네임 스페이스에만 적용 할 수 있습니다. 'System.IO.Path'는 유형을하지 네임 스페이스입니다
모든 금발

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 = new FileStream (str_uploadpath, FileMode.Create, FileAccess.ReadWrite);
모든 금발

1
@All은 코드를 디버그하려고합니다. 오류가 발생한 줄 바로 앞에 중단 점을 놓습니다 (Visual Studio의 경우 F9). 프로그램을 실행하십시오. 프로그램이 중단 점에서 중지되면 변수 위에 마우스를 올려 놓습니다 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 메서드에서 해당 오류가 발생합니다. 확실히 유효하고 정확한 경로인데 왜 오류가 발생합니까?
Triynko 2012 년

51

작성자가 전체 경로로 파일 이름을 저장하려고 할 때 오류가 발생했음을 알았습니다. 실제로이 ":"오류를 얻으려면 파일 이름에를 포함 하는 것으로 충분합니다 . ":"파일 이름에 있을 수있는 경우 (예 : 파일 이름에 날짜 스탬프가있는 경우) 다른 것으로 바꾸십시오. 즉 :

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

2
이로 인해 파일 이름과 관련된 문제가 해결되었습니다. 현재 날짜와 시간을 내 파일에 추가하고 ":"값으로 인해 내 프로그램에서 참조 된 오류 OP가 발생했습니다.
acedanger

1
이것은 종종 사용하여 발생 Path.GetInvalidPathChars하지만 Path.GetInvalidFileNameChars, 같은 날의 경우였다.
Seph

4
감사합니다! 이것이 여러 답변을 게시하는 것이 항상 좋은 생각 인 이유입니다.
Nick

31

나에게 문제는 인간의 눈에 보이지 않는 "‪" Left-To-Right Embedding 캐릭터였습니다.
Windows 파일 속성 보안 탭에서 경로를 복사하여 붙여 넣은 후 문자열 시작 부분 ( 'D'바로 앞)에 붙어 있습니다.

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 날짜 문자열이 포함 된 파일을 저장했지만 잘못된 ":"! 감사!
Mason

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

이것은 OP의 문제는 아니지만 다른 사람을 도울 수있는 내 문제였습니다.

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

SSIS에서 파일 아카이브를 만들기 위해 간단한 파일 시스템 작업에 사용하기 위해 변수에 대한 (제한된) 식 작성기를 사용하고 있습니다.

오류를 막기 위해 콜론을 제거하는 빠르고 더러운 방법입니다. @ [User :: LocalFile] + "-"+ REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "-") + ".xml"


0

오늘도 같은 문제가 발생했습니다. 내 코드에로드하려는 파일이 Excel에서 편집 할 수 있도록 열려있었습니다. Excel을 닫은 후 코드가 작동하기 시작했습니다!


-1

값이 file : // C : / whatever와 같은 파일 URL 인 경우 Uri 클래스를 사용하여 일반 파일 이름으로 변환합니다.

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

일반적으로 제공된 API를 사용하는 것이 가장 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.