[c#] “지정된 경로의 형식은 지원되지 않습니다.”

내 웹 서비스에 다음 코드가 있습니다.

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\\.

이 문자열에 어떤 문제가 있습니까?



답변

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

Path.Combine(str_uploadpath, fileName);

문자열을 반환합니다.


답변

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

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


답변

나에게 문제는 인간의 눈에 보이지 않는 "‪" 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

따라서 언뜻보기에 동일한 두 줄은 실제로 다릅니다.


답변

파일 시스템에 파일을 저장하려는 경우. 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());


답변

이 오류를 유발할 수있는 다른 요인은 다음과 같습니다.

전체 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.

이것이 누군가에게 두통을 덜어주기를 바랍니다 …!


답변

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


답변

변경 시도 :

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

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