File Sync Code





from
https://dobon.net/vb/dotnet/file/synchronizedirectory.html
https://dobon.net/vb/dotnet/file/deletedirectory.html

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace FileSync
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Out.WriteLine("args.Length="+args.Length);

            //CopyDirectory("d:\\1", "d:\\2", true, true);
            if (args.Length == 2)
            {

                Console.Out.WriteLine("source 0 =" + args[0]);
                Console.Out.WriteLine("target 1 =" + args[1]);



                //DirectoryInfoオブジェクトの作成
                DirectoryInfo di = new DirectoryInfo(args[1]);

                //フォルダ以下のすべてのファイル、フォルダの属性を削除
                RemoveReadonlyAttribute(di);

                CopyDirectory(args[0], args[1], true, true);




               
            }
            else
            {
                Console.Out.WriteLine("Error:Must have 2 arg!");
           
            }
        }





        //using System.IO;
        //がソースファイルの一番上に書かれているものとする

        /// <summary>
        /// ディレクトリをコピーする
        /// </summary>
        /// <param name="sourceDirName">コピーするディレクトリ</param>
        /// <param name="destDirName">コピー先のディレクトリ</param>
        /// <param name="newerOnly">新しいファイルのみコピーする</param>
        /// <param name="sync">sourceDirNameにないファイルを削除する</param>
        public static void CopyDirectory(
            string sourceDirName,
            string destDirName,
            bool newerOnly,
            bool sync)
        {
            //コピー先のディレクトリがないときは作る
            if (!Directory.Exists(destDirName))
            {
                Directory.CreateDirectory(destDirName);
                //属性もコピー
                File.SetAttributes(destDirName, File.GetAttributes(sourceDirName));
            }

            //コピー先のディレクトリ名の末尾に"\"をつける
            if (destDirName[destDirName.Length - 1] != Path.DirectorySeparatorChar)
            {
                destDirName = destDirName + Path.DirectorySeparatorChar;
            }

            //コピー元のディレクトリにあるファイルをコピー
            string[] files = Directory.GetFiles(sourceDirName);
            foreach (string f in files)
            {
                string destFileName = destDirName + Path.GetFileName(f);
                //コピー先にファイルが存在し、
                //コピー元より更新日時が古い時はコピーする
                if (!newerOnly ||
                    !File.Exists(destFileName) ||
                    File.GetLastWriteTime(destFileName) < File.GetLastWriteTime(f))
                {
                    File.Copy(f, destFileName, true);
                }
            }

            //コピー先にあってコピー元にないファイルを削除
            if (sync)
            {
                DeleteNotExistFiles(sourceDirName, destDirName);
            }

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

        /// <summary>
        /// destDirNameにありsourceDirNameにないファイルを削除する
        /// </summary>
        /// <param name="sourceDirName">比較先のフォルダ</param>
        /// <param name="destDirName">比較もとのフォルダ</param>
        private static void DeleteNotExistFiles(
            string sourceDirName,
            string destDirName)
        {
            try
            {

                //sourceDirNameの末尾に"\"をつける
                if (sourceDirName[sourceDirName.Length - 1] != Path.DirectorySeparatorChar)
                {
                    sourceDirName = sourceDirName + Path.DirectorySeparatorChar;
                }

                //destDirNameにありsourceDirNameにないファイルを削除する
                string[] files = Directory.GetFiles(destDirName);
                foreach (string f in files)
                {
                    if (!File.Exists(sourceDirName + Path.GetFileName(f)))
                    {
                        File.Delete(f);
                    }
                }

                //destDirNameにありsourceDirNameにないフォルダを削除する
                string[] folders = Directory.GetDirectories(destDirName);
                foreach (string folder in folders)
                {
                    if (!Directory.Exists(sourceDirName + Path.GetFileName(folder)))
                    {
                        Directory.Delete(folder, true);
                    }
                }
            }
            catch (Exception ex)
            {
               
                //throw;
            }

        }






        public static void RemoveReadonlyAttribute(DirectoryInfo dirInfo)
        {
            //基のフォルダの属性を変更
            if ((dirInfo.Attributes & FileAttributes.ReadOnly) ==
                FileAttributes.ReadOnly)
                dirInfo.Attributes = FileAttributes.Normal;
            //フォルダ内のすべてのファイルの属性を変更
            foreach (FileInfo fi in dirInfo.GetFiles())
                if ((fi.Attributes & FileAttributes.ReadOnly) ==
                    FileAttributes.ReadOnly)
                    fi.Attributes = FileAttributes.Normal;
            //サブフォルダの属性を回帰的に変更
            foreach (DirectoryInfo di in dirInfo.GetDirectories())
                RemoveReadonlyAttribute(di);
        }

    }
}
















留言

熱門文章