2010-08-09 55 views
2

我有一个目录以一个句点(。)结尾,由rsync通过Cygwin在Windows服务器上创建。C# - 阅读目录结尾的时期

我试图读取此目录中的文件的代码,但我得到一个异常,说它“无法找到路径的一部分”,并且程序试图读取的路径中缺少结束周期。

是否有可能通过C#读取以句点结尾的目录?

谢谢你的帮助。

代码beeing使用:

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

请告诉我们,你是curently使用的代码? – 2010-08-09 12:21:48

+0

我无法在Windows Vista上创建以一段时间结束的目录。我尝试通过Exporer和一个命令提示符。两种方法都会创建目录的名称,但省略句号。编辑:一样的文件。 – 2010-08-09 12:30:22

回答

0

检查下面的Test()方法。它具有本地和UNC路径的示例,并且可以处理以点结尾的文件。该代码基于http://blogs.msdn.com/b/bclteam/archive/2007/03/26/long-paths-in-net-part-2-of-3-long-path-workarounds-kim-hamilton.aspx中的代码,该代码还具有删除文件的代码。

基本上你从Win32 API获得一个FileHandle,并将它传递给.Net。

[编辑 - 新代码]

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

谢谢Mikael,我会试试这个。 – Freddy 2010-08-09 13:33:47

+0

您是否知道这是否适用于映射驱动器和驱动器,而不是二进制文件所在的位置? – Freddy 2010-08-09 14:53:59

+0

我将我的代码示例更改为其他方法。 – 2010-08-09 19:53:45

2

在DOS/Windows的时期是延长的隔板,甚至是目录名有扩展。所以路径"c:\some\path.""c:\some\path"相同。如果您尝试访问具有句点的目录,它将实际访问它,因此如果您设法创建了一个在句尾处有句号的目录名称,则无法使用它。