2013-03-26 6 views
6

Non sono riuscito a trovare alcuna informazione su questo tramite il professore Google, quindi eccomi qui. Prendi il nome del percorso indicato e incollalo in Windows Explorer. Mi sono imbattuto in questo dopo aver scoperto bug nel mio codice che ha generato i percorsi con un extra "." nel nome del percorso prima di un separatore di directory \ ...Strano comportamento da .NET per quanto riguarda i percorsi dei file

@"C:\\pathto.\file.ext" 

Nel codice, .NET accetterà il percorso quando si chiama File.Create e un file verrà generato, ma in questo percorso:

@"C:\\pathto\file.ext" 

Copia C:\\pathto.\file.ext nella barra degli indirizzi di Esplora risorse e guarda "." scomparire e portarti a C:\\pathto\file.ext

E 'normale comportamento per .NET e Windows a Non sta causando un problema perché il'. ' viene rimosso da entrambi. NET e Windows quando passato in operazioni di file. Il vero problema è che tutti i file nel DB hanno nomi di file con un '. \', Ma esiste in percorsi che non hanno un '. \' ... e anche File.Exists(), sebbene il percorso non sia il 'reale' posizione fisica ...

Cosa sta succedendo qui?

+0

In primo luogo, è possibile rendere più facile copiare e incollare i percorsi utilizzando, ad esempio. '@" C: \ Users \ Matt "' format (un 'letterale stringa letterale'). –

+0

Forse Windows vieta nomi di file (e cartelle) che iniziano o finiscono con '.'? –

+0

Sì, questo è normale. Prova a creare una cartella che termina con un punto fermo fa lo stesso. – TheKingDave

risposta

4

Questa è una "funzionalità" del file system di Windows. MSDN:

Non terminare un nome file o directory con uno spazio o un punto. Sebbene il file system sottostante possa supportare tali nomi, la shell di Windows e l'interfaccia utente no. Tuttavia, è accettabile specificare un punto come primo carattere di un nome. Ad esempio ".temp".

0

Tutte le API normali di Windows ignorano/rimuovere punti finali nei nomi dei file/cartella quando percorso regolare viene passato.

Se davvero bisogno di supporto per il punto finale è necessario utilizzare "\\?\" percorsi prefissati e interoperabilità tutto chiama te stesso (come .Net non supporta questo formato di file). Vedi MSDN: Naming Files, Paths, and Namespaces, How to delete a folder that name ended with a dot (".")? e You cannot delete a file or a folder on an NTFS file system volume per ulteriori informazioni.

Ecco quesito, che mostra come Pinvoke funzione che accetta il percorso di file lungo: c# call Win32 API for long file paths?

Problemi correlati