2014-07-08 171 views
0

我正在開發一個小型應用程序,它接收一個csv文件,刪除所有行,除了那些在第二列中有「關鍵」的行。您只需輸入輸入路徑和輸出路徑,即可完成操作。一切都很好,直到我決定做拖放。我將輸入文件拖到Windows窗體中,文本框會自動填充我需要的路徑。大。然後填充輸出路徑。但是,當我按執行按鈕,我得到「路徑中的非法字符」錯誤。但是,當我輸入拖動時出現的相同確切路徑時,該程序起作用!任何想法,如果他們是像我看不到的隱藏的角色?這裏是我的代碼:如何在拖放C#時獲得正確和乾淨的路徑?

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     this.AllowDrop = true; 

    } 



    private void button1_Click(object sender, EventArgs e) 
    { 
     String inputpath = textBox1.Text; 

     String outputpath = textBox2.Text; 

     MessageBox.Show(inputpath, outputpath); 





     var retainedLines = File.ReadAllLines(@inputpath) 


      .Where((x, i) => i == 0 || (x.Split(',')[1]).Contains("critical")); 
     if (inputpath.Equals(outputpath)) 
     { 
     File.Delete(@inputpath); 
     }    
     File.WriteAllLines(@outputpath, retainedLines); 

    } 

    private void Form1_DragDrop(object sender, DragEventArgs e) 
    { 
     string[] fileList = (string[])e.Data.GetData(DataFormats.FileDrop, false); 

     foreach (string s in fileList) 
     { 

      String k= String.Format("{0}{1}", s, Environment.NewLine); 
      k = k.Replace("\n", String.Empty); 
      textBox1.Clear(); 
      textBox1.Text = k; 

     } 




    } 


    private void Form1_DragEnter(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent(DataFormats.FileDrop, false)) 
      e.Effect = DragDropEffects.All; 


    } 
} 
+0

我已經試過了,結果相同 – XenonDragon

回答

0

我覺得你的問題是在這兩條線

String k= String.Format("{0}{1}", s, Environment.NewLine); 
k = k.Replace("\n", String.Empty); 

此處添加Environment.NewLine(即Windows操作系統定義爲一對夫婦字符\r\n),然後將代碼刪除\n但離開\r

因此,當您嘗試讀取該文件名時,會在路徑中出現無效字符。

一個簡單的解決方法是

private void button1_Click(object sender, EventArgs e) 
{ 
    String inputpath = textBox1.Text.Trim(); 
    .... 
} 

,但可能需要修改了一下你如何在TextBox1中添加的文件。
例如,如果Drop操作具有多個文件,則只會使用列表中最後一個文件,您的代碼將忽略它。 (如果這是故意那麼忽略此注意事項)

\r字符只是在回車字符的C#(和其他C派生語言)的轉義表示(CR U + 000D)

如需詳細瞭解回車和換行字符見this article on Wikipedia

+0

就像一個魅力!非常感謝!你能告訴我關於\ r角色嗎? – XenonDragon