2011-04-05 3 views
1

질문은 다른 질문 (GetDirectories fails to enumerate subfolders of a folder with #255 name)과 비슷합니다. 파일 이름이 ""와 같은 경우 내 C# 3.5 .NET 응용 프로그램에서공백으로 구성된 이름의 파일을 여는 방법은 무엇입니까?

내가,

using (FileStream fileStream = 
new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 

그러나 사용하여 파일을 열려고하고, 코드는 예외

실패 첫 번째 예외 유형이 인 경우 System.IO.DirectoryNotFoundException ' 이 mscorlib.dll에서 발생했습니다. 정보 : 경로 "C : \ Temp \"의 일부를 찾을 수 없습니다.

.NET을 사용하여 이러한 파일을 열 수 있습니까?

P. 이것은 인공적인 상황이 아니며 (예전의 질문으로 의심되는 사람과 같은), 그러한 파일은 대중적인 소프트웨어로 완벽하게 만들 수 있습니다. 공백만으로 구성된 이름으로 메일 폴더를 생성하면 Thunderbird가 그러한 파일을 생성 할 수 있습니다. 이름 ""로 파일을 생성

  • 다운로드 및 극동에서 극동 사령관이나 모질라 썬더 버드
  • 를 설치

    다음 단계를 수행 재현합니다. 썬더 버드에 이름 "
+0

win XP에서이 폴더를 만들 수 없습니까? 당신은 그렇게 않았다 방법? – manji

+0

이것은 나가 아니라 썬더 버드입니다. – Alex

+0

아니면 Far 또는 Total Commander와 같은 파일 지휘관을 사용할 수 있습니다. – Alex

답변

3

파일을 액세스하는 일반적인 .Net 방식은 특수 문자를 고려하지 않는 것으로 보입니다. 내 첫 번째 대답은 파일 이름이 공백이라고 가정했지만 이제는 Alt + 255 문자로 지정했습니다. 다음은 Win32 API를 사용하여 파일을 여는 Console App의 예입니다.

class Program 
{ 
    public const UInt32 GENERIC_ALL = 0x10000000; 
    public const UInt32 GENERIC_READ = 0x80000000; 
    public const UInt32 GENERIC_WRITE = 0x40000000; 
    public const UInt32 GENERIC_EXECUTE = 0x20000000; 
    public const UInt32 FILE_SHARE_READ = 0x00000001; 
    public const UInt32 FILE_SHARE_WRITE = 0x00000002; 
    public const UInt32 CREATE_ALWAYS = 2; 
    public const UInt32 CREATE_NEW = 1; 
    public const UInt32 OPEN_ALWAYS = 4; 
    public const UInt32 OPEN_EXISTING = 3; 
    public const UInt32 TRUNCATE_EXISTING = 5; 

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)] 
    private static extern Microsoft.Win32.SafeHandles.SafeFileHandle CreateFile(string lpFileName, System.UInt32 dwDesiredAccess, System.UInt32 dwShareMode, IntPtr pSecurityAttributes, System.UInt32 dwCreationDisposition, System.UInt32 dwFlagsAndAttributes, IntPtr hTemplateFile); 

    static void Main(string[] args) 
    { 
     Microsoft.Win32.SafeHandles.SafeFileHandle oSafeHandle = CreateFile(@"Path to your folder\ ", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); 
     using (FileStream oFS = new FileStream(oSafeHandle, FileAccess.Read)) 
     { 
      Console.WriteLine("file was opened"); 
     } 

     Console.ReadLine(); 
    } 
} 
+0

고마워요, 제이콥! 솔루션처럼 보입니다. 테스트하고 알려 드리겠습니다. – Alex

+0

당신의 솔루션은 작동합니다 - 고마워요. 유일한 점은 파일이 255 개의 기호가 아니라는 것입니다. 실제로는 이름에 공백 만 포함되어 있습니다. 그러나, 그것은 여전히 ​​귀하의 솔루션과 함께 작동합니다. – Alex

1

윈도우 위의 코드를 사용하여" "

  • 라는 이름의 파일을 열어보십시오"와 메일 계정에 하위 폴더를 만들 수는 파일 이름을 지정해야합니다, 당신은 만들 수 없습니다 파일 하나의 공백의 이름. Windows Naming Conventions

    먼저 유효한 이름의 파일을 만든 다음 코드에서 참조해야합니다.

  • +0

    감사하지만이 의견은 Mozilla에 보낼 수있는 의견입니다. 나는 그런 파일의 창조와 관련이 없다. 기존 파일을 열면됩니다. – Alex

    +0

    질문 파일 설명에 대한 파일 작성 방법을 단계별로 추가했습니다. – Alex

    관련 문제