C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: フォルダ・ファイルのコピー処理について


(過去ログ 173 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■99833 / inTopicNo.1)  フォルダ・ファイルのコピー処理について
  
□投稿者/ 河童 (16回)-(2022/06/12(Sun) 18:00:17)

分類:[C#] 

VS2022 C#でフォルダー・ファイルのコピー処理を作成しています。

コピー処理は、下記のページを参考にしました。
https://apuridasuo.hatenablog.com/entry/2020/07/13/191616
コピー先のディレクトリがないときはエラーに変更しています。

わからないことは、
Set_CopyDirectory の処理でコピー先のディレクトリが変更になり
コピー先のディレクトリが固定にならないことです。

やりたいことは、コピー元からコピー先へコピーすることです。

コピー処理の方法を教えてください。
よろしくお願いします。


        private void button6_Click(object sender, EventArgs e)
        {

            try
            {
                string dir = @"C:\Work\Update";
                // 更新フォルダ確認(ファイルの有無)
                if (!Directory.EnumerateFileSystemEntries(dir).Any())
                {
                    MessageBox.Show("更新ファイルはありません");
                    return;
                }
            

                // 更新実行確認(バージョン確認)
                // 更新前にプロセス確認
                Process[] ps = Process.GetProcessesByName("notepad");
                foreach (Process p in ps)
                {
                    p.Kill();
                    p.WaitForExit(1000);
                    if (p.HasExited) MessageBox.Show("メモ帳終了");
                }


                string CopyFldName = @"C:\Work\Update";
                string PasteFldName = @"C:\Test";
                int iRet = 0;
                // 更新実行
                iRet = Set_CopyDirectory(CopyFldName, PasteFldName);
                if (iRet == 0)
                {
                    // 更新終了(正常)
                    MessageBox.Show("更新終了しました。");
                }
                else
                {
                    // 更新終了(異常)
                    MessageBox.Show("更新できませんでした");
                }
                   
            }
            catch (Exception ex)
            {
                MessageBox.Show("更新できませんでした");
            }

        }

        public int Set_CopyDirectory(string CopyFldName, string PasteFldName)
        {
            int iRet = 0;
     
            //コピー先のディレクトリがないときはエラー
            if (!Directory.Exists(PasteFldName))
            {
                return -1;
            }
            //コピー先のディレクトリ名の末尾に"\"をつける
            if (PasteFldName[PasteFldName.Length - 1] != Path.DirectorySeparatorChar)
            {
                PasteFldName = PasteFldName + Path.DirectorySeparatorChar;
            }
            //コピー元のディレクトリにあるファイルをコピー ※ここで並列処理
            string[] files = Directory.GetFiles(CopyFldName);
            Parallel.ForEach(files, (file) =>
            {
                File.Copy(file, PasteFldName + Path.GetFileName(file), true);
            });
            //コピー元のディレクトリにあるディレクトリについて、再帰的に呼び出す
            string[] dirs = Directory.GetDirectories(CopyFldName);
            foreach (string dir in dirs)
            {
                Set_CopyDirectory(dir, PasteFldName + Path.GetFileName(dir));
            }

            return iRet;

        }

引用返信 編集キー/
■99834 / inTopicNo.2)  Re[1]: フォルダ・ファイルのコピー処理について
□投稿者/ WebSurfer (2493回)-(2022/06/12(Sun) 18:17:28)
No99833 (河童 さん) に返信

質問する際は何を何で作っているかを質問の一行目に書きましょう。

(例: ASP.NET Windows Forms アプリを Visual Studio 2022 でフレームワークを
.NET 6.0 として作っています・・・とか)

引用返信 編集キー/
■99835 / inTopicNo.3)  Re[1]: フォルダ・ファイルのコピー処理について
□投稿者/ 伝説のカレー (14回)-(2022/06/12(Sun) 18:47:46)
No99833 (河童 さん) に返信

> わからないことは、
> Set_CopyDirectory の処理でコピー先のディレクトリが変更になり
> コピー先のディレクトリが固定にならないことです。

んー何にお困りなんですかね
コピーするだけなら参考のコードでできそうですけど

Set_CopyDirectoryが最初に呼ばれたとき、コピー先のディレクトリが存在しないならエラーにしたい
Set_CopyDirectoryが再帰で呼ばれたとき、コピー先のディレクトリが存在しないなら作成したい
みたいな感じですか?
引用返信 編集キー/
■99837 / inTopicNo.4)  Re[2]: フォルダ・ファイルのコピー処理について
□投稿者/ 河童 (17回)-(2022/06/12(Sun) 20:49:15)
No99835 (伝説のカレー さん) に返信
VS2022 C# .NET5.0でWindwosフォームアプリを作成しています。

> Set_CopyDirectoryが最初に呼ばれたとき、コピー先のディレクトリが存在しないならエラーにしたい
> Set_CopyDirectoryが再帰で呼ばれたとき、コピー先のディレクトリが存在しないなら作成したい
> みたいな感じですか?

やりたいことは、
1.最初に呼ばれたディレクトリ「C:\Test」がなければエラーで処理終了
2.再帰で呼ばれたときもディレクトリは、最初のディレクトリ「C:\Test」にしたい

困っていることは、
再帰で呼ばれたときにディレクトリが「C:\Test\Test」になって処理が終了します。

再帰で呼ばれたときもディレクトリを「C:\Test」にする方法があれば教えてください。

よろしくお願いします。





引用返信 編集キー/
■99838 / inTopicNo.5)  Re[3]: フォルダ・ファイルのコピー処理について
□投稿者/ 伝説のカレー (15回)-(2022/06/12(Sun) 21:36:28)
No99837 (河童 さん) に返信

こうかな

public int Set_CopyDirectory(string CopyFldName, string PasteFldName)
{
  int iRet = 0;

  //コピー先のディレクトリがないときはエラー
  if (!Directory.Exists(PasteFldName))
  {
    return -1;
  }

  //コピー元のディレクトリにあるファイルをコピー ※ここで並列処理
  string[] files = Directory.GetFiles(CopyFldName);
  Parallel.ForEach(files, (file) =>
  {
    File.Copy(file, Path.Combine(PasteFldName, Path.GetFileName(file)), true);
  });

  //コピー元のディレクトリにあるディレクトリについて、再帰的に呼び出す
  string[] dirs = Directory.GetDirectories(CopyFldName);
  foreach (string dir in dirs)
  {
    Set_CopyDirectory(Path.Combine(CopyFldName, dir), PasteFldName);
  }

  return iRet;
}

引用返信 編集キー/
■99839 / inTopicNo.6)  Re[4]: フォルダ・ファイルのコピー処理について
□投稿者/ 伝説のカレー (16回)-(2022/06/12(Sun) 22:03:52)
No99838 (伝説のカレー さん) に返信

LINQ使った方が簡単かも

Directory.EnumerateFiles(CopyFldName, "*", SearchOption.AllDirectories)
  .AsParallel()
  .ForAll(x => File.Copy(x, Path.Combine(PasteFldName, Path.GetFileName(x)), true));

引用返信 編集キー/
■99840 / inTopicNo.7)  Re[4]: フォルダ・ファイルのコピー処理について
□投稿者/ 伝説のカレー (17回)-(2022/06/12(Sun) 22:32:54)
No99838 (伝説のカレー さん) に返信

> foreach (string dir in dirs)
> {
> Set_CopyDirectory(Path.Combine(CopyFldName, dir), PasteFldName);
> }

↑は↓これでいいですね、てへぺろ

foreach (string dir in dirs)
{
Set_CopyDirectory(dir, PasteFldName);
}


引用返信 編集キー/
■99842 / inTopicNo.8)  Re[5]: フォルダ・ファイルのコピー処理について
□投稿者/ 河童 (18回)-(2022/06/13(Mon) 09:59:41)
No99840 (伝説のカレー さん) に返信
ありがとうございました。
コピー処理が完成しました。
解決済み
引用返信 編集キー/
■99843 / inTopicNo.9)  Re[4]: フォルダ・ファイルのコピー処理について
□投稿者/ radian (42回)-(2022/06/13(Mon) 10:41:34)
2022/06/13(Mon) 10:50:47 編集(投稿者)

> //コピー元のディレクトリにあるファイルをコピー ※ここで並列処理
> Parallel.ForEach(files, (file) =>
> {
> File.Copy(file, Path.Combine(PasteFldName, Path.GetFileName(file)), true);
> });

通常、ディスクはシーケンシャルに書き込むのが一番速いので、
下手に並列処理しない方がいいと思いますよ。

※ツリーは伝説のカレーさんへの返信になっていますが、
河童さん宛てと間違えました。失礼しました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -