2015-03-09 3 views
0

Lors de l'appel File.OpenRead() sur un fichier sur un partage réseau où existe un dossier avec le même nom (mais le boîtier différent), UnauthorizedAccessException. Cela peut arriver sur les partages Linux où le boîtier est important.File.OpenRead() throws UnauthorizedAccessException lorsqu'un répertoire avec le même chemin existe

Exemple: * P: est mis en correspondance \ somemachine \ someshare * P: \ files \ est un dossier * P: \ files \ sortie est un fichier * P: \ fichiers \ output est un dossier

le code suivant lancer:

const string path = @"P:\files\OUTPUT"; 

DirectoryInfo dir = new DirectoryInfo(Path.GetDirectoryName(path)); 
FileInfo file = dir.EnumerateFiles().FirstOrDefault(x => string.Equals(Path.GetFileName(path), x.Name)); 

// All of the below throws UnauthorizedAccessException    
file.OpenRead(); 
FileStream stream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
File.OpenRead(path); 

Est-il possible que je peux ouvrir le boîtier de fichier sensible? Ce n'est pas une option pour renommer le fichier ou déplacer le dossier car il s'agit d'un partage en lecture seule.

+0

Cela ressemble plus à une question d'administration - c'est ainsi que SMB prend en charge les clients insensibles à la casse comme Windows. Cochez [this] (http://superuser.com/questions/431342/linux-both-case-sensitive-and-case-insensitive-and-always-inconvenient) question dans le superutilisateur. Pour Windows et SMB 'P: \ files \ OUTPUT' et' p: \ files \ output' sont les mêmes –

Répondre

1

C'est la valeur par défaut SAMBA behaviour:

Ce qui est lexicalement premier sera accessible aux utilisateurs de MS Windows; les autres sont invisibles et inaccessibles toute autre solution serait suicidaire.

La seule option sûre consiste à utiliser des noms différents pour le dossier et le fichier. Essayer de s'assurer que l'un ou l'autre est lexicalement en premier est (par les docs) ... suicidaire.

EDIT

D'après les commentaires, il semble que le Bloc-notes peut ouvrir le fichier correct. En dépit de son apparence simpliste, le Bloc-notes fait un lot de travail pour gérer des cas complexes, comme la détection d'un fichier quand aucune nomenclature n'est disponible. Il peut également utiliser de longs chemins Unicode (par exemple, \\?\P:\files\OUTPUT) pour accéder à des fichiers, des flux et des partages alternatifs, ou détecter un volume réseau et passer au format de chemin long.

System.IO ne supporte pas cela car il est spécifique à NTFS, mais le AlphaFS open-source donne accès à ceci et à BEAUCOUP d'autres fonctionnalités NTFS comme les transactions et les ID d'objet.

Vous pouvez utiliser AlphaFS pour ouvrir le fichier en utilisant un chemin d'accès long, même si je n'ai pas essayé cela.

+0

Avez-vous des explications sur les raisons pour lesquelles, par exemple, Bloc-notes est capable d'ouvrir le fichier? De la pure chance? – larsmoa

+1

Pas exactement, même si le Bloc-notes fait un ** lot ** de travail pour gérer par exemple étrange. Fichiers Unicode sans nomenclature Il peut utiliser de longs chemins pour les partages (commençant par \\? \) Bien que je n'ai pas vérifié. Quel nom de fichier votre code renvoie-t-il? 'OUTPUT' ou' ouput'?En outre, avez-vous vérifié les attributs de l'objet FileInfo retourné? Est-ce que 'FileInfo.Exists' est vrai? –

-1
  1. Vérifiez l'autorisation d'accès de sécurité du fichier.
+0

2. Définissez les propriétés de flush autoflush de true à true. –

+0

Vous pouvez donner une extension au chemin du fichier afin qu'il identifie le fichier ou le dossier –