2010-08-09 6 views
2

J'ai un répertoire qui se termine par un point (.), Créé par rsync via Cygwin sur un serveur Windows. Le code que j'ai essaye de lire un fichier dans ce répertoire mais j'obtiens une exception disant qu'il "n'a pas pu trouver une partie du chemin" et la période de fin est manquante du chemin que le programme essaye de lire.C# - Lecture du répertoire se terminant par la période

Est-il possible de lire des répertoires se terminant par un point via C#?

Nous vous remercions de votre aide.

code beeing utilisé:

StreamReader sr = null; 
try 
    { 
    sr = new StreamReader(@"<path_ending_in_period>", System.Text.Encoding.Default); 
    } 
catch (Exception ex) 
    { 
      .... 
    } 
+1

S'il vous plaît nous montrer le code que vous utilisez curently? –

+0

Je ne peux pas créer un répertoire sur Windows Vista qui se termine par une période. J'ai essayé Exporer et une invite de commande. Les deux méthodes créent le nom du répertoire mais omettent la période. EDIT: Idem pour un fichier. –

Répondre

0

Vérifiez la méthode Test() ci-dessous. Il a des exemples pour le chemin local et UNC, et travaille avec des fichiers se terminant par un point. Le code est basé sur le code trouvé à http://blogs.msdn.com/b/bclteam/archive/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx, qui a également le code pour supprimer le fichier.

Fondamentalement, vous obtenez un FileHandle de l'API Win32, et le transmettre à .Net.

[Modifier - nouveau code]

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Runtime.InteropServices; 
using Microsoft.Win32.SafeHandles; 

namespace ConsoleApplication1 
{ 
    internal class WeirdFilename 
    { 
     public static void Test() 
     { 
      //string formattedName = @"\\?\c:\temp\dot."; 
      string formattedName = @"\\?\UNC\m1330\c$\temp\dot."; 
      SafeFileHandle fileHandle = CreateFile(formattedName, 
                EFileAccess.GenericRead, EFileShare.None, IntPtr.Zero, 
                ECreationDisposition.OpenExisting, 0, IntPtr.Zero); 

      // Check for errors 
      int lastWin32Error = Marshal.GetLastWin32Error(); 
      if (fileHandle.IsInvalid) 
      { 
       throw new Win32Exception(lastWin32Error); 
      } 

      // Pass the file handle to FileStream. FileStream will close the handle 
      using (FileStream fs = new FileStream(fileHandle, FileAccess.Read)) 
      { 
       StreamReader reader = new StreamReader(fs); 
      } 
     } 


     #region ECreationDisposition enum 

     public enum ECreationDisposition : uint 
     { 
      New = 1, 
      CreateAlways = 2, 
      OpenExisting = 3, 
      OpenAlways = 4, 
      TruncateExisting = 5, 
     } 

     #endregion 

     #region EFileAccess enum 

     [Flags] 
     public enum EFileAccess : uint 
     { 
      GenericRead = 0x80000000, 
      GenericWrite = 0x40000000, 
      GenericExecute = 0x20000000, 
      GenericAll = 0x10000000, 
     } 

     #endregion 

     #region EFileAttributes enum 

     [Flags] 
     public enum EFileAttributes : uint 
     { 
      Readonly = 0x00000001, 
      Hidden = 0x00000002, 
      System = 0x00000004, 
      Directory = 0x00000010, 
      Archive = 0x00000020, 
      Device = 0x00000040, 
      Normal = 0x00000080, 
      Temporary = 0x00000100, 
      SparseFile = 0x00000200, 
      ReparsePoint = 0x00000400, 
      Compressed = 0x00000800, 
      Offline = 0x00001000, 
      NotContentIndexed = 0x00002000, 
      Encrypted = 0x00004000, 
      Write_Through = 0x80000000, 
      Overlapped = 0x40000000, 
      NoBuffering = 0x20000000, 
      RandomAccess = 0x10000000, 
      SequentialScan = 0x08000000, 
      DeleteOnClose = 0x04000000, 
      BackupSemantics = 0x02000000, 
      PosixSemantics = 0x01000000, 
      OpenReparsePoint = 0x00200000, 
      OpenNoRecall = 0x00100000, 
      FirstPipeInstance = 0x00080000 
     } 

     #endregion 

     #region EFileShare enum 

     [Flags] 
     public enum EFileShare : uint 
     { 
      None = 0x00000000, 
      Read = 0x00000001, 
      Write = 0x00000002, 
      Delete = 0x00000004, 
     } 

     #endregion 

     [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
     internal static extern SafeFileHandle CreateFile(
      string lpFileName, 
      EFileAccess dwDesiredAccess, 
      EFileShare dwShareMode, 
      IntPtr lpSecurityAttributes, 
      ECreationDisposition dwCreationDisposition, 
      EFileAttributes dwFlagsAndAttributes, 
      IntPtr hTemplateFile); 
    } 
} 
+0

Merci Mikael, je vais essayer ça. – Freddy

+0

Savez-vous si cela fonctionnera sur les lecteurs mappés et les lecteurs autres que ceux où se trouve le binaire? – Freddy

+0

J'ai changé mon exemple de code pour une méthode différente. –

2

Dans DOS/Windows la période est un séparateur pour l'extension, et même les noms de répertoire des extensions. Ainsi, le chemin "c:\some\path." est identique à "c:\some\path". Si vous tentez d'accéder au répertoire avec la période, il y accédera réellement sans, donc si vous avez réussi à créer un nom de répertoire avec un point à la fin, vous ne pouvez pas l'utiliser.

Questions connexes