2016-12-14 45 views
0

試圖爲我的公司編寫一個小型Windows應用程序。我暫時堅持的部分是試圖在計算機上搜索「.myox」文件(或者說任何文件類型)。下面是我編制的代碼。我是一名試圖開始編碼的業餘程序員。目前我們使用下面的代碼的問題是它跳過了計算機上幾乎所有的位置,除了「拒絕訪問」之外。我以管理員身份運行VS,並且我也是計算機上的管理員。不知道我錯過了什麼,但如果有人能指引我走向正確的方向,那將是驚人的。在計算機上搜索「.myox」文件

private void FindAllFiles() 
{ 
int drvCount; 
int drvSearchCount = 0; 
DriveInfo[] allDrives = DriveInfo.GetDrives(); 
drvCount = allDrives.Count(); 

foreach (DriveInfo dr in allDrives) 
{ 
    lbAllFiles.Items.Clear(); 
    drvSearchCount++; 

    //removable drives 
    if (!dr.IsReady) 
    break; 

    foreach (string dir in Directory.GetDirectories(dr.ToString())) 
    { 
    try 
    { 
     foreach (string files in Directory.GetFiles(dir, "*.myox")) 
     { 
     lbAllFiles.Items.Add(files); 
     } 

    } 
    catch (Exception Error) 
    { 

    } 
} 

if (drvSearchCount == drvCount) 
break; 
} 

MessageBox.Show("Done searching your computer"); 
} 

在此先感謝。 -Manu

+0

你可以試試'FileIOPermission的權限=新的FileIOPermission(FileIOPermissionAccess.Read,目錄); 權限.AddPathList(FileIOPermissionAccess.Read,file); permission.Demand();' –

回答

1

我看到很少的「潛在」問題,將在下面列出它們。

首先,你是這樣做的主要(UI)線程將阻止整個應用程序給你沒有關於當前狀態的反饋。您可以使用Thread來擺脫此問題。此操作的結果將產生另一個問題,即訪問lbAllFiles,因爲(我認爲)它是UI的一部分。你可以很容易地擺脫這個問題,使List<string>可以在FindAllFiles操作過程中填充,然後分配到lbAllFiles.Items

第二個問題是:

foreach (string files in Directory.GetFiles(dir, "*.myox")) 
{ 
    lbAllFiles.Items.Add(files); 
} 

Directory.GetFiles(...)將僅返回已符合pattern參數文件,這樣你可以簡單地做:

var files = Directory.GetFiles(dir, "*.myox"); 
if (files != null && files.Length > 0) 
    lblAllFiles.Items.AddRange(files); 

而且finaly獲得(或檢查)允許您可以Demand()權限,因爲我已在評論中發佈:

foreach (string dir in Directory.GetDirectories(dr.ToString())) 
    { 
    FileIOPermission permission = new FileIOPermission(FileIOPermissionAccess.Read, dir); 
    try 
    { 
     permission.Demand(); 
     var files = Directory.GetFiles(dir, "*.myox"); 
     if (files != null && files.Length > 0) 
      lblAllFiles.Items.AddRange(files); 
    } 
    catch (Exception Error) 
    { 

    } 
} 

讓我知道是否幫助你。如果沒有,我會嘗試用另一個解決方案更新我的答案。

+0

感謝您的及時回覆。我現在只是有一個小問題。例如,我在桌面上有一個「.myox」文件,但該程序會捕獲一個異常情況 - 「訪問路徑C \ users \ all users \ microsoft \ windows \ systemdata被拒絕」,然後跳到C \ Windows文件夾,並且不會在用戶(C \ users \ Manu \ desktop \)下找到其他文件夾下的其他子文件夾。是否還需要添加其他內容? 非常感謝您花時間回答我的問題。 – manuviswan

1

我在你的代碼中注意到的一件事是你沒有瀏覽所有的目錄和子目錄。對於這一點,在那裏你調用GetDirectories功能,不僅送的路徑,但使用枚舉Alldirectories:

foreach (string dir in Directory.GetDirectories(dr.ToString(),System.IO.SearchOption.AllDirectories))