LoginSignup
0
3

More than 5 years have passed since last update.

windowsファイル移動して移動先のリンクを残すC#コード

Last updated at Posted at 2018-06-11

ファイルサーバがいっぱいで書けなくて困ったので、
使ってなさそうなものを別のとこに移動し
他の人がこまらないように移動先のショートカットを作成するコードを書いた
リンクの作り方参考ありがとうdobon.net

/* 
 ~自動ファイル移動スクリプト~

    特定フォルダから拡張子指定でのファイルをピックアップし
    ファイルツリーを保持したまま別フォルダに移動する。(コピー後消去)
    移動後はファイル移動先のショートカットを残す。
*/

//--------------------
// 設定
//--------------------

var deleteFile = true;
var createLink = true;

var fitypeTarget = ".zip";
var diTargets = new DirectoryInfo(@"\\fs1\hoge");
var bkupToDiTop = new DirectoryInfo(@"\\fs2\bkup\");

//--------------------
// 処理
//--------------------

//対象ファイル取得
var fiTargets = diTargets
    .EnumerateFiles("*", SearchOption.AllDirectories)
    .Where(t => t.Name.ToLower().EndsWith(fitypeTarget))
    ;//.Take(1);

//元ファイルとコピー先を取得
var targets = fiTargets.Select(
    t => new KeyValuePair<FileInfo, FileInfo>(
            t, new FileInfo( Path.Combine(bkupToDiTop.FullName + Regex.Replace(t.FullName, @"^\\\\", @"\")) )
        )
    );

Func<FileInfo, FileInfo, FileInfo> linkFi = (fi, toFi) => {
    try {
        if (createLink) {
            var shortcutPath = fi.FullName + ".lnk";
            var targetPath = toFi.FullName;

            var t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8"));
            dynamic wsh = Activator.CreateInstance(t);
            var shortcut = wsh.CreateShortcut(shortcutPath);
            shortcut.TargetPath = targetPath;
            shortcut.Save();

            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(shortcut);
            System.Runtime.InteropServices.Marshal.FinalReleaseComObject(wsh);
            return new FileInfo(fi.FullName + ".lnk");
        }
        return new FileInfo(fi.FullName);
    } catch (Exception) {
        return null;
    }
};

Func<FileInfo, FileInfo, FileInfo> copyAndLinkFi = (fi, toFi) => {
    try {
        Console.WriteLine(fi.FullName);
        if(!toFi.Directory.Exists){
            toFi.Directory.Create();
        }
        fi.CopyTo(toFi.FullName, true);
        if (deleteFile) {
            Console.WriteLine("Delete: " + fi.FullName);
            fi.Delete();
        }
        return linkFi(fi, toFi);
    } catch (Exception) {
        return null;
    }
};

var results = targets.AsParallel()
    .Select(t => copyAndLinkFi(t.Key, t.Value))
    .Select(t => t.FullName);

Console.WriteLine( "Finish. linkfile:" + results.Count() );

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3