簡體   English   中英

Directory.Move():進程無法訪問該文件,因為它正被另一個進程使用?

[英]Directory.Move(): The process cannot access the file because it is being used by another process?

在我的下面的代碼中,我試圖將位於一個文件夾中的所有.doc文件移動到另一個文件夾中。 在生產中,這將生成到創建的文件夾C:\\Temp\\的文件移動到具有數據庫作業的網絡文件夾,該文件夾作業每5分鍾將文件從網絡文件夾移動到我們的文檔想象存檔系統中。

在嘗試下面的測試代碼時,我收到"The process cannot access the file because it is being used by another process."

碼:

public void moveLocalToCommitFYI()
        {
            // MOVE DOCS FORM TEMP FOLDER TO COMMITFYI FOLDER
            string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\";
            string dirDest = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\DestTest\";

            try
            {
                Directory.Move(dirSource, dirDest);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
            }
        }

我覺得奇怪的是,當我直接指定一個源文件並且它的目的地時,代碼函數正常:

public void moveLocalToCommitFYI()
        {
            // MOVE DOCS FORM TEMP FOLDER TO COMMITFYI FOLDER
            string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTestFile.doc";
            string dirDest = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\MoveTestFile.doc";

            try
            {
                Directory.Move(dirSource, dirDest);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Source:\t" + ex.Source + "\nMessage: \t" + ex.Message + "\nData:\t" + ex.Data);
            }
        }

當然有一種方法可以將所有.doc文件從一個目錄移動到另一個目錄,而無需循環並指定每個單獨的文件名?

編輯:

修改了我的目標文件夾是我桌面上的不同文件夾而不是子文件夾。 dirSource包含5個單詞文檔,目標目錄(我桌面上的\\ MoveTest \\)不包含任何文件:

string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\";
            string dirDest = @"C:\Users\NAME\Desktop\MoveTest\";

生成"Cannot create a file when that file already exists"

基於此,我假設代碼實際上是將設置目錄文件夾及其所有內容從一個位置移動到另一個位置,因此我將代碼修改為以下內容:

string dirSource = @"C:\Users\NAME\Desktop\CommitTest\MoveTest\";
            string dirDest = @"C:\Users\NAME\Desktop\MoveTest2\";

這擺脫了我的子文件夾\\ MoveTest \\在\\ Desktop \\ CommitTest \\和創建的文件夾\\ Desktop \\ MoveTest2。

有沒有辦法讓我移動文件夾的內容而不刪除源文件夾並將它們放入已創建的目標?

您的測試代碼正在嘗試將整個目錄移動到其自身內的目錄中。 這不是有效的操作。 您的實際代碼可能正在嘗試將整個Temp目錄移動到另一個位置。 這與將其中的所有文件移動到另一個目錄不同。

您必須遍歷所有文件名並單獨移動每個文件。

var files = Directory.EnumerateFiles(dirSource, "*.doc")
                     .Select(path => new FileInfo(path));
foreach (var file in files)
    file.MoveTo(Path.Combine(dirDest, file.Name));

如果您發現個別移動會給網絡流量增加太多開銷(如果這是一個緩慢的Internet連接而不是快速本地連接,則尤為重要),您可能需要先壓縮所有doc文件(例如使用ZipFile )將它們傳輸到服務器,然后讓服務器解壓縮它們。 此壓縮可能會降低整體大小,並且傳輸一個文件而不是多個文件將減少網絡開銷。

您無法在自身下方移動文件夾。 你需要找到它的所有內容並移動它們。 或者這樣做:將MoveTest重命名為MoveTest2,創建一個新的MoveTest目錄,現在您可以在其下移動MoveTest。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM