2009-08-19 4 views
2

je reçois une chaîne plus ou moins ressemble à ceci:chemins de fichier avec des caractères non-ascii et FileInfo en C#

"C:\\bláh\\bleh" 

Je fais un FileInfo avec elle, mais quand je vérifie son existence il retourne faux :

var file = new FileInfo(path); 
file.Exists; 

Si je Renommez manuellement le chemin d'accès

"C:\\blah\\bleh" 

au moment de la mise au point et veiller à ce blah existe d'esprit h a bleh dedans, alors file.Exists commence à retourner vrai. Donc, je crois que le problème est le caractère non-ascii.

La chaîne actuelle est créée par mon programme. Une partie vient de l'AppDomain de l'application, qui est la partie qui contient le "á", l'autre partie vient, en quelque sorte, de l'utilisateur. Les deux parties sont assemblées par Path.Combine. J'ai confirmé la validité de la chaîne résultante de deux façons: en la copiant de l'erreur que mon programme génère, ce qui inclut le chemin, dans l'explorateur ouvre le fichier très bien. En regardant cette chaîne au débogueur, elle semble correctement échappée, en ce que \ est écrit comme \. Le "á" est imprimé littéralement par le débogueur.

Comment dois-je traiter une chaîne de sorte que même si elle a des caractères non-ascii, il s'avère être un chemin valide?

+0

D'où provient la chaîne? est-il codé dans un fichier de code ou est-il fourni par l'utilisateur? –

+0

Fredrik Mörk, je viens d'ajouter cette information à la question elle-même. – Pablo

+1

C'est un bizarre. J'ai créé un fichier avec le même chemin et le même nom, et le code suivant affiche '' True '':' FileInfo fi = new FileInfo ("C: \\ bláh \\ bleh"); Console.WriteLine (fi.Exists); ' –

Répondre

0

Le problème était: le programme n'avait pas assez d'autorisations pour accéder à ce fichier. La fixation des autorisations a corrigé le problème. Il semble que lorsque je n'ai pas fait mon expérience, j'ai réussi à reproduire le problème d'autorisation, éventuellement en créant le dossier sans le caractère non-ascii à la main et en copiant l'autre.

Oh ... tellement embarrassant.

0

essayer cette

string sourceFile = @"C:\bláh\bleh"; 
    if (File.Exists(sourceFile)) 
    { 

     Console.WriteLine("file exist."); 

    } 
    else 
    { 
     Console.WriteLine("file does not exist."); 

    } 

Note: La méthode Exists ne doit pas être utilisé pour la validation du chemin, cette méthode vérifie simplement si le fichier spécifié dans le chemin existe. Passer un chemin invalide à Exists renvoie false.

Pour la validation de chemin, vous pouvez utiliser Directory.Exists.

+0

Je n'essaie pas de valider le chemin, je veux être sûr que le fichier existe réellement. – Pablo

0

Je viens manuall créé un dossier Blah contenant un fichier bleh, et cela en place, ce code imprime True comme prévu:

using System; 
using System.IO; 

namespace ConsoleApplication72 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string filename = "c:\\bláh\\bleh"; 

      FileInfo fi = new FileInfo(filename); 

      Console.WriteLine(fi.Exists); 

      Console.ReadLine(); 
     } 
    } 
} 

Je suggère de vérifier la source de votre chaîne - en particulier, Bien que votre représentant 3k dise que c'est le problème, rappelez-vous qu'exprimer une barre oblique inversée comme \\ est un artefact de syntaxe C#, et vous voulez vous assurer que votre chaîne ne contient réellement que \ s.

+0

La chaîne vient d'ailleurs et j'ajoute juste plus de choses avec Path.Combine. Lorsque j'imprime la chaîne, il ressemble à c: \ bláh \ bleh, que je peux copier et coller dans la boîte de texte du chemin d'accès de l'explorateur et il ouvre le fichier. Et quand je le regarde dans le débogueur, je vois c: \\ bláh \\ bleh, donc je crois que la chaîne est correcte. Latter sur je vais essayer de le faire dans une application de la console comme vous l'avez fait et voir ce qui se passe. – Pablo

0

Se référant à @ réponse de adatapost, la liste des caractères du nom de fichier non valide (glanées System.IO.Path.GetInvalidFileNameChars() en fait ne contient pas de caractères normaux avec diacritiques.

Il semble que la question que vous posez est vraiment, "How do I remove diacritics from a string (ou dans ce cas, fichier chemin) »

ou peut-être vous ne posez cette question, et vous voulez vraiment trouver un fichier avec un nom:.

c:\blòh\bleh 

(ou quelque chose de similaire). Dans ce cas, vous devez alors essayer d'ouvrir un fichier avec le même nom, et pasc:\bloh\bleh.

+0

Je veux travailler sur le fichier c: \ bláh \ bleh, pas sur c: \ blah \ bleh. J'ai essayé mon programme avec c: \ blah \ bleh juste pour vérifier que le "á" était le problème. Si je change le chemin d'une manière quelconque, je finirai par pointer vers un fichier qui n'existe pas, parce que le chemin est correct (je peux le copier et le coller dans l'explorateur et le fichier correct s'ouvre). – Pablo

0

Regardez comme le "bleh" dans le chemin est un répertoire, pas un fichier. Pour vérifier si le dossier existe, utilisez la méthode Directory.Exists.

+0

Non, c'est un fichier. – Pablo

1

Voici une méthode qui va gérer les signes diacritiques dans les noms de fichiers. Le succès de la méthode File.Exists dépend de la façon dont votre système stocke le nom de fichier.

public bool FileExists(string sPath) 
{ 
    //Checking for composed and decomposed is to handle diacritics in filenames. 
    var pathComposed = sPath.Normalize(NormalizationForm.FormC); 
    if (File.Exists(pathComposed))  
     return true; 

    //We really need to check both possibilities. 
    var pathDecomposed = sPath.Normalize(NormalizationForm.FormD); 
    if (File.Exists(pathDecomposed))  
     return true; 

    return false; 
} 
Questions connexes