2011-02-18 4 views
0

내 코드의 일부에서 파일이 있는지 확인한 다음 열어 보겠습니다.파일 이름에 둘 이상의 연속 된 공백이 포함 된 파일로 재생

한 명의 직원이 두 개 이상의 공백 문자가 포함 된 파일 이름에 문제가 발생했습니다.

나는 사실입니다. 파일이 (예를 들어, "SPAM는 SO 94318099       PO의 10610.msg을 CERTS") 때

string filePath = Path.Combine(helper.MillTestReportPath, fileName); 

// Ouverture du fichier 
if (File.Exists(filePath)) 
{ 
    Process.Start(filePath); 
} 
else 
{ 
    MessageBox.Show("Le fichier n'existe pas!", "Fichier introuvable", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

모든 것이 거의 모든 파일을 찾을 작품 나는, 하나 개 이상의 공간을 포함 : 여기 내 코드의 단편이다 File.Exists로 false가 나오더라도 직접 Process를 실행하려고해도 실패합니다 ...

어떻게 해결할 수 있는지 알고 싶습니다.

고맙습니다.

+5

하나의 제안은'String.Concat()'보다'Path.Combine()'을 선호하는 것입니다. –

+0

그건 뭔가 다른,'Process.Start'로'spaces.txt'를 가진'my file을 열려고 시도했는데 잘 동작합니다. 디버그하고'filePath' 변수의 값이 무엇인지 확인하십시오. –

+0

@ Shadow : 나는 하나 이상의 공백으로 말했습니다. 단일 공백이있는 파일은 정상적으로 작동합니다. – TomShreds

답변

0

공간의 수는 문제가되지 않습니다. filePath의 출력 문자열을 확인 했습니까? 나는 그것이 옳지 않을 것이라고 확신한다. Henk이 제안한 것처럼 출력이 올바르지 않으면 Path.Combine()으로 변경하십시오.

+0

답변 주셔서 감사합니다, 나는 Path.Combine로 변경하고 여전히 작동하지 않습니다. 출력 문자열은 괜찮습니다. "R : \\ 중첩 \\ 밀 테스트 보고서 \\ 스팸 항공사 SO 94414834 PO 11304.msg "당신 생각은 어떻 니? – TomShreds

+0

탈출구 대신 @"yourpath "를 사용하면 안전하고 더 많은 기회를 얻을 수 있습니다. – Mathieu

+0

@Tom copy 디버깅하는 동안 정확한 경로를 찾아서 직접 탐색하십시오. m Windows 탐색기 -이 방법으로 파일에 액세스 할 수 있습니까? –

0

당신이 지정한 동일한 파일 이름을 사용하여이 테스트 코드를 실행 journée가 :

 const string path = @"C:\TEMP\SPAM CERTS S O 94318099 P O 10610.msg"; 
     if (File.Exists(path)) { 
      Trace.WriteLine("EXIST"); 
      Process.Start(path); 
     } 
     else { 
      Trace.WriteLine("NOT EXIST"); 
     } 

이 파일이 올바르게 등, 심지어 여러 개의 연속 공백이 존재하는 것으로 확인되고 또한 성공적으로 시작하는 관련된 프로그램 (Noteapad ++ 내 경우).

나는 다른 사람이 지적한 것처럼, 귀하의 문제가 다른 곳에서 발생했다고 생각합니다. Process에서 발생한 오류는 무엇입니까? 시작하십시오.

try { 
    string path = Path.Combine(helper.MillTestReportPath, fileName); 
    using (FileStream fs = File.Open(path, FileMode.CreateNew)) { 
    } 
    } catch (IOException ex) { 
    // any exception here? 
    } 
0

호출자에게 필요한 권한을 가지고 있으며, 경로는의 이름을 포함

경우는 true 기존 파일; 그렇지 않으면 false입니다. path가 null, 무효 인 패스, 또는 길이 제로의 캐릭터 라인의 경우에도,이 메소드는 false를 돌려줍니다. 호출자에게 지정된 파일을 읽을 수있는 권한이없는 경우 예외가 throw되지 않으며 메서드는 경로의 존재 여부와 상관없이 false를 반환합니다.

파일이있는 경우 파일에 액세스하려는 사용자에게 필요한 권한이없는 것일 수 있습니다.

5

따르면 MSDN documentation에, File.Exists 반환 : 해당 파일의 경로로이 작업을 할 때 어떻게됩니까

0

다른 사람들이 이미 파일에 관련된 내용을 다뤘지만 체크 문자열과 로컬 파일 시스템의 현지화/인코딩을 고려해 보셨습니까?

독일어를 사용하고 있습니까? 당신의 메시지 박스 프롬프트에서, 사과를 오렌지와 비교했을지도 모릅니다 ... 단지 생각.

+0

carmbrester로부터의 코멘트는 똑같은 것에 관한 것이고, 코멘트가 숨겨져 있고 단지 그것을 알아 차 렸을 정도로 그들이 정확하면 신용을 얻어야한다 :) – Perry

+0

하지만 독일어는 아니지만 실제로 프랑스어;) – froeschli

0

안녕하세요. 부모 dir을 프로그래밍 방식으로 나열하십시오. 그리고 나서 각 자식 파일에 대해 char-by-char이라는 모든 파일 이름을 echo합니다. 빈 칸이나 유니 코드 코드를 선호합니다.

아마도 파일 이름의 어딘가에 약간의 공백 문자가있을 것입니다. 특히 파일 이름이 일부 keystore 또는 xml 파일에서 자동으로 생성 된 경우.

2

귀하의 파일 이름에는 ANSI 공백 문자 (char)32 0020hex뿐 아니라 공백 문자와 구별 할 수없는 다른 ANSI 문자가 포함되어있을 것으로 생각됩니다.

파일이 NTFS 드라이브에있는 경우 파일 이름에 유니 코드 문자가 포함될 수도 있습니다. MSDN: Character Sets Used in File Names

  • 내가 당신에게 16 진수로 현재 폴더의 파일 이름을 표시하는 작은 PowerShell 스크립트를 작성

    dir | % { 
        $chars = $_.Name.ToCharArray(); """$($_.Name)"""; 
        $result = "|"; 
        foreach ($char in $chars) { 
         $result += [String]::Format(" {0} |",$char) 
        }; 
        "$result"; 
         $result = "|" 
         foreach ($char in $chars) { 
          $hexChar = [System.Convert]::ToInt32($char); 
          $result += $hexChar.ToString("x4"); 
          $result += "|"; 
          }; 
         "$result`r`n"; 
        } 
    

    일반적인 출력은

    "1000 €.txt" 
    | 1 | 0 | 0 | 0 | | € | . | t | x | t | 
    |0031|0030|0030|0030|0020|20ac|002e|0074|0078|0074| 
    
    "A normal file.txt" 
    | A | | n | o | r | m | a | l | | f | i | l | e | . | t | x | t | 
    |0041|0020|006e|006f|0072|006d|0061|006c|0020|0066|0069|006c|0065|002e|0074|0078|0074| 
    
    "what the ңёςк.txt" 
    | w | h | a | t | | t | h | e | | ң | ё | ς | к | . | t | x | t | 
    |0077|0068|0061|0074|0020|0074|0068|0065|0020|04a3|0451|03c2|043a|002e|0074|0078|0074| 
    
         etc. 
    

    당신이 볼 수있다 여기에 0020hex로 실제 ANSI 공간.

관련 문제