1

ローカル LAN 共有経由で約 50 GB のデータをコピーしているときに、接続の問題により、約 10 GB のコピーでコピーに失敗しました。

コピーした 10 GB のデータ ディレクトリの名前を localRepository に変更し、ファイルがローカル リポジトリに見つからない場合にのみ、リモート サーバーからコピー先にファイルをコピーする C# プログラムを作成しました。見つかった場合は、ファイルをローカル リポジトリから宛先フォルダーに移動します。

コードは正常に機能し、タスクを非常にうまく達成しましたが。私は、最も効率的なコードを書いたのでしょうか? 改善点は見つかりましたか?

string destinationFolder = @"C:\DataFolder";
        string remoteRepository = @"\\RemoteComputer\DataFolder";
        string localRepository = @"\\LocalComputer\LocalRepository";

        protected void Page_Load(object sender, EventArgs e)
        {
            foreach (string remoteSrcFile in Directory.EnumerateFiles(remoteRepository, "*.*", SearchOption.AllDirectories))
            {
                bool foundInLocalRepo = false; ;
                foreach (var localSrcFile in Directory.EnumerateFiles(localRepository, "*.*", SearchOption.AllDirectories))
                {

                    if (Path.GetFileName(remoteSrcFile).Equals(Path.GetFileName(localSrcFile)))
                    {
                        FileInfo localFile = new FileInfo(localSrcFile);
                        FileInfo remoteFile = new FileInfo(remoteSrcFile);

                        //copy this file from local repository
                        if (localFile.Length == remoteFile.Length)
                        {
                            try
                            {
                                File.Move(localSrcFile, PrepareDestinationPath(remoteSrcFile));
                                Debug.WriteLine(remoteSrcFile + " moved from local repo");
                            }
                            catch (Exception ex)
                            {
                                Debug.WriteLine(remoteSrcFile + " did not move");
                            }
                            foundInLocalRepo = true;
                            break;
                        }
                    }
                }
                if (!foundInLocalRepo)
                {
                    //copy this file from remote repository
                    try
                    {
                        File.Copy(remoteSrcFile, PrepareDestinationPath(remoteSrcFile), false);
                        Debug.WriteLine(remoteSrcFile + " copied from remote repo");
                    }
                    catch (Exception ex)
                    {
                        Debug.WriteLine(remoteSrcFile + " did not copy");
                    }

                }
            }
        }

        private string PrepareDestinationPath(string remoteSrcFile)
        {
            string relativePath = remoteSrcFile.Split(new string[] { "DataFolder" }, StringSplitOptions.None)[1];
            string copyPath = Path.GetFullPath(destinationFolder + relativePath);
            Directory.CreateDirectory(Path.GetDirectoryName(copyPath));
            return copyPath;
        }

編集:

トーマスからの回答に基づいて、ファイルを圧縮しようとしています。従来、エンド ユーザーはファイルを圧縮してからコピーしていました。プログラマーとして、ファイルを並行して圧縮してコピーできますか? 圧縮された部分をワイヤーで送るということですか?

4

2 に答える 2

2

ネストされたループであまりにも多くの作業を行っています。

内部の「foreach」を削除し、次のようなコードに置き換える必要があります。

(1) 探しているファイルの名前を構成し、

(2) File.Exists() を使用して存在するかどうかを確認し、次に

(3) 「if (Path.GetFileName(remoteSrcFile)...」条件に従って、現在持っているのと同じコード ブロックを続行します。

このようなもの:

foreach (string remoteSrcFile in Directory.EnumerateFiles(remoteRepository, "*.*", SearchOption.AllDirectories))
{
    string localSrcFile = Path.Combine(localRepository, Path.GetFileName(remoteSrcFile));

    if (File.Exists(localSrcFile))
    {
        ...
    }
}
于 2012-09-19T08:01:15.107 に答える
1

移動する前にファイルを圧縮することをお勧めします。非常に単純なhttp://dotnetzip.codeplex.com/を見てみましょう

一度に 1000 個のファイルを圧縮してみてください。そうすれば、for ループを何度も実行して、毎回新しい接続などを確立する必要がなくなります。

于 2012-09-19T08:02:11.860 に答える