2011-02-18 69 views
0

在我的代碼的某些部分,我檢查是否存在文件,然後打開它。播放其文件名中包含多個連續空格的文件

一位員工遇到包含多個空格字符的文件名問題。

我檢查,這是真的。下面是我的代碼片段:

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); 
} 

一切正常,只是找到幾乎所有的文件,但是當一個文件(「垃圾郵件SO證書94318099       PO 10610.msg」例如)包含一個以上的空間,我獲得與File.Exists假,即使我直接嘗試運行Process.Start它失敗...

任何想法,我怎麼能解決這個問題?

非常感謝!

+5

一個建議是更喜歡`Path.Combine()`通過`String.Concat()`。 – 2011-02-18 15:38:19

+0

這是另一回事,現在嘗試用`Process.Start`打開`my文件與spaces.txt`,它工作得很好。調試並檢查`filePath`變量的值是什麼。 – 2011-02-18 15:39:44

+0

@Shadow:我說了不止一個空格。單個空格的文件就好了。 – TomShreds 2011-02-18 15:43:30

回答

0

空格的數量不應該是一個問題。你檢查了filePath的輸出字符串嗎?我相信它不會是正確的。正如Henk所建議的,如果輸出不正確,請嘗試更改爲Path.Combine()。

博訥JOURNEE

0

使用您指定的文件名相同冉這個測試代碼:

 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.Start出現什麼故障?

0

當您嘗試這與該文件路徑會發生什麼:

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

MSDN documentationFile.Exists回報:

如果真調用方具有所需的權限和路徑包含的名字現有文件;否則,是錯誤的。如果路徑爲空,無效路徑或零長度字符串,此方法也會返回false。如果調用方沒有足夠的權限來讀取指定的文件,則不會引發異常,並且無論路徑是否存在,該方法都會返回false。

如果該文件存在,那麼試圖訪問該文件的用戶可能沒有必要的權限。

0

我認爲其他人已經覆蓋了文件相關的東西,我會檢查,但你有沒有考慮本地化/編碼在你的檢查字符串與本地文件系統?

看來您使用的是德語嗎?在你的消息框提示中,可能會將蘋果與橘子進行比較...只是一個想法。

0

嘿。請以編程方式列出父目錄。然後爲每個子文件回顯所有文件名char-by-char。最好使用十六進制或Unicode代碼。

您可能在文件名中有某些不重要的空白字符。尤其是如果文件名是從某個keystore或xml文件自動生成的。

2

我懷疑你的文件名不僅包含ANSI空格字符(char)32 0020hex,而且其他ANSI字符不能與空格字符區分。

如果您的文件駐留在NTFS驅動器上,則文件名甚至可以包含Unicode字符。

我寫了一個小的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. 

你可以看到真正的ANSI空間在這裏是0020hex。

相關問題