it-swarm.it

"Il formato del percorso indicato non è supportato."

Ho il seguente codice nel mio servizio web:

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

Qualcuno può aiutarmi a risolvere il problema con questo messaggio di errore dalla riga 2 del codice.

Il formato del percorso indicato non è supportato.

L'autorizzazione sulla cartella è impostata per l'accesso completo a tutti ed è il percorso effettivo della cartella.

Il punto di interruzione mi ha dato il valore di str_uploadpath come C:\\webprojects\\webservices\\UploadBucket\\Raw\\.

Cosa c'è di sbagliato in questa stringa?

85
All Blond

Piuttosto che usare str_uploadpath + fileName, prova a usare System.IO.Path.Combine invece:

Path.Combine(str_uploadpath, fileName);

che restituisce una stringa.

104
user586399

Vedo che il mittente ha scoperto che si è verificato l'errore durante il tentativo di salvare il nome file con un intero percorso. In realtà è sufficiente avere un ":" nel nome del file per ottenere questo errore. Se ci potrebbe essere ":" nel nome del tuo file (ad esempio se hai un timbro data nel nome del tuo file) assicurati di sostituirli con qualcos'altro. vale a dire: 

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

Se si sta tentando di salvare un file nel file system. Path.Combine non è a prova di proiettile in quanto non ti aiuterà se il nome del file contiene caratteri non validi. Ecco un metodo di estensione che rimuove i caratteri non validi dai nomi dei file:

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

E l'utilizzo può essere:

Path.Combine(str_uploadpath, fileName.ToSafeFileName());
18
ThiagoPXP

Tra le altre cose che possono causare questo errore:

Non è possibile avere determinati caratteri nella stringa PathFile completa.

Ad esempio, questi caratteri interromperanno la funzione StreamWriter:

"/"  
":"

potrebbero esserci altri caratteri speciali che lo bloccano troppo . Ho scoperto che questo accade quando si tenta, ad esempio, di inserire un timbro DateTime in un nome file:

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

Un modo per prevenire questo problema è sostituire i caratteri problematici in NewFileOutS con quelli benigni:

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

Spero che questo salvi qualcuno mal di testa ...!

7
Michael Herman

Per me il problema era invisibile all'occhio umano "‪"Incorporamento da sinistra a destra carattere.
Si è bloccato all'inizio della stringa (appena prima della "D"), dopo che ho copiato il percorso, dalla scheda di sicurezza delle proprietà del file di Windows.

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

Quindi quelli, identici a prima vista, due linee sono in realtà diversi.

3
Oleg Grishko

Prova a cambiare:

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

a

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

2
JimSTAT

Se ricevi questo errore in PowerShell, è molto probabile perché stai utilizzando Resolve-Path per risolvere un percorso remoto, ad es.

 Resolve-Path \\server\share\path

In questo caso, Resolve-Path restituisce un oggetto che, una volta convertito in una stringa, non restituisce un percorso valido. Restituisce il percorso interno di PowerShell:

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

La soluzione è usare la proprietà ProviderPath sull'oggetto restituito da Resolve-Path:

> Resolve-Path \\server\share\path | Select-Object -ExpandProperty PRoviderPath
\\server\share\path
> (Resolve-Path \\server\share\path).ProviderPath
\\server\share\path
2
Aaron Jensen

Questo era il mio problema, che potrebbe aiutare qualcun altro - sebbene non fosse il problema dell'OP:

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

Ho determinato il problema emettendo il mio percorso in un file di registro e trovandolo non formattato correttamente. La correzione per me era abbastanza semplice:

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

Usa il Path.Combine metodo help? È un modo più sicuro per unire insieme i percorsi dei file. Potrebbe essere che abbia problemi ad unire i percorsi insieme

1
Kurru

Sto usando il generatore di espressioni (limitato) per una variabile da utilizzare in una semplice attività del file system per creare un archivio di un file in SSIS.

Questo è il mio trucco veloce e sporco per rimuovere i due punti per fermare l'errore: @ [User :: LocalFile] + "-" + REPLACE ((DT_STR, 30, 1252) GETDATE (), ":", "- ") +" .xml "

0
Adam Noël

Se il valore è un file url come file: // C:/qualunque sia, usa la classe Uri per tradurre in un nome file regolare:

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

In generale, l'utilizzo dell'API fornita è la migliore prassi.

0
Chris Bordeman