2017-04-21 49 views
-2

我有以下模塊,它是搜索DOCX文件中的文本的較大程序的一部分。這是單擊搜索按鈕時的代碼;C#FileCreationTime

 { 
     this.resultListView.Items.Clear(); 

     try 
     { 
      foreach (var filePath in Search(this.txtDirectory.Text, this.txtSearch.Text, this.cBoxUseSubdirectories.Checked, this.cBoxCaseSensitive.Checked, this.rBtnRegex.Checked)) 
      { 
       var file = new FileInfo(filePath); 


       this.resultListView.Items.Add(new ListViewItem(new string[] { file.Name, string.Format("{0:0.0}", file.Length/1024d), file.FullName})); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(this, string.Format("Exception details:\n{0}", ex), string.Format("Exception '{0}' occurred.", ex.GetType()), MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 
    } 

這是用上面的參數調用的Search方法的代碼;

private static IEnumerable<string> Search(string directory, string searchString, bool searchSubdirectories, bool caseSensitive, bool useRegex) 
{ 
    var isMatch = useRegex ? new Predicate<string>(x => Regex.IsMatch(x, searchString, caseSensitive ? RegexOptions.None : RegexOptions.IgnoreCase)) 
     : new Predicate<string>(x => x.IndexOf(searchString, caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase) >= 0); 

    foreach (var filePath in Directory.GetFiles(directory, "*.docx", searchSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)) 
    { 
     string docxText; 

     using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
      docxText = new DocxToStringConverter(stream).Convert(); 

     if (isMatch(docxText)) 
      yield return filePath; 
    } 
} 

還有其他一些我認爲不適用的類。

結果通過這個填充在listview中;

this.resultListView.Items.Add(new ListViewItem(new string[] { file.Name, string.Format("{0:0.0}", file.Length/1024d), file.FullName})); 
      } 

我想添加一個額外的列來顯示找到的文件的文件創建日期。我試着添加這個;

var fileCreatedDate = File.GetCreationTime(filePath); 

然後將file.fileCreatedDate添加到this.resultListView.Items.Add但它不起作用。

關於如何將文件創建日期從現有代碼中提取的任何建議?

回答

0

返回IEnumerable的元組實例。

private static IEnumerable<Tuple<string, DateTime>> Search(string directory, string searchString, bool searchSubdirectories, bool caseSensitive, bool useRegex) 
{ 
    var isMatch = useRegex ? new Predicate<string>(x => Regex.IsMatch(x, searchString, caseSensitive ? RegexOptions.None : RegexOptions.IgnoreCase)) 
     : new Predicate<string>(x => x.IndexOf(searchString, caseSensitive ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase) >= 0); 

    foreach (var filePath in Directory.GetFiles(directory, "*.docx", searchSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly)) 
    { 
     string docxText; 

     using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
      docxText = new DocxToStringConverter(stream).Convert(); 

     if (isMatch(docxText)) 
      yield return new Tuple<string, DateTime>(filePath, System.IO.File.GetLastWriteTime(filePath)); 
    } 
} 

元組將具有兩個屬性:Item1和Item2。 Item1是路徑,Item2是日期。

你也可以用你自己的類代替Tuple,但Tuple很容易編碼。

+0

與此我得到一個錯誤; '不能將類型System.Tuple 隱式轉換爲鍵入'string'? –

0

通過一些試驗和錯誤,我設法排序問題。

我將此添加到初始按鈕點擊代碼;

var fileCreatedDate = File.GetCreationTime(filePath); 

然後這個;

 this.resultListView.Items.Add(new ListViewItem(new string[] { file.Name, string.Format("{0:0.0}", file.Length/1024d), file.FullName, fileCreatedDate.ToString()})); 

fileCreated.ToString()對它進行排序。