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