0

以下の関数を使用して、すべてのサブディレクトリを含むディレクトリ全体を同じドライブ上の別のフォルダにコピーしようとしています:

    private static void CopyAll(DirectoryInfo source, DirectoryInfo target)
    {
        // Check if the target directory exists, if not, create it.
        if (Directory.Exists(target.FullName) == false)
        {
            Directory.CreateDirectory(target.FullName);
        }

        // Copy each file into it’s new directory.
        foreach (FileInfo fi in source.GetFiles())
        {
            Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name);
            fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
        }

        // Copy each subdirectory using recursion.
        foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
        {
            DirectoryInfo nextTargetSubDir = target.CreateSubdirectory(diSourceSubDir.Name);
            CopyAll(diSourceSubDir, nextTargetSubDir);
        }
    }

呼び出し:

    public void copyTemplate(string templatepath, string destpath)
    {
        DirectoryInfo s = new DirectoryInfo(@"C:\temp\templates\template1");
        DirectoryInfo t = new DirectoryInfo(@"C:\temp\www_temp\gtest");

        CopyAll(s, t);
    }

エラーが発生します:

The process cannot access the file 'C:\temp\templates\template1\New folder\alf.txt' because it is being used by another process.

ファイルは私が使用しておらず、サードパーティのソフトウェアはファイルをロックしているプロセスがないことを示しているため、コピー機能がどこかでトリップしていると思われます。

なぜこれが起こっているのか、またはより良い仕事をする機能を提案できる人はいますか?

ありがとう

4

2 に答える 2

1

ファイルへのアクセスをロックすることを検討することをお勧めします。速度が低下しすぎないようにする必要があり、同時にファイルにアクセスしようとする試みを回避する必要があります。

private object lockObj = new object();

lock(lockObj)
{
 //Code to access file
}

これで問題が解決するはずです。

于 2012-07-12T13:43:33.970 に答える
0

CopyAll() 関数を以下に置き換えると、問題が解決しました。

public static void CopyFolder(string sourceFolder, string destFolder)  
        {  
            if (!Directory.Exists(destFolder))  
                Directory.CreateDirectory(destFolder);  
            string[] files = Directory.GetFiles(sourceFolder);  
            foreach (string file in files)  
            {  
                string name = Path.GetFileName(file);  
                string dest = Path.Combine(destFolder, name);  
                File.Copy(file, dest);  
            }  
            string[] folders = Directory.GetDirectories(sourceFolder);  
            foreach (string folder in folders)  
            {  
                string name = Path.GetFileName(folder);  
                string dest = Path.Combine(destFolder, name);  
                CopyFolder(folder, dest);  
            }  
        }  
于 2012-07-12T14:18:45.703 に答える