主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

IronPython: メディアフォルダのバックアップスクリプト

                
 マイミュージックに入っている音楽ファイル数が6000ほど。まあだいぶたまったもんだなと。以前これのバックアップとして、コピーを別HDDに作っておいた。ファイル数がそのときから多少増えたので、バックアップを更新したい。せいぜい新しく数百曲入ったぐらいなので、その新しく入った曲をバックアップフォルダに移してくれればいいんだが。

1.フォルダごとふつうにコピーしようとする
6000ものファイルを? 効率悪い。

2.コマンドプロンプトでXCopyを使う
コピー先に存在していないファイルのみをコピーする、ということができない。

3.バックアップソフトを使う
すでに別の目的で使っている。その設定に上書きをしなければ、新しいバックアップを作成できない。いやだ。

4.スクリプトを書く
そうしよう。ファイル検索は、.NET FrameworkにあるSystem.IOを使うのが便利だった。一行で、サブディレクトリも含めたファイル検索が書ける。だからIronPythonでスクリプトを書く

動作: 拡張子付きのファイルを、相対パスで、コピー元のフォルダからすべて拾ってくる。コピー先で、相対パスに一致するファイルがあればコピーは行わない。相対パスに一致するファイルがなければ、コピーをおこなう。

使い方: ipy.exe ACopy.py 'source directory' 'target directory'

ACopy.py
import sys

import System
from System.IO import DirectoryInfo

def getRelativePathNET(currentDir, dirInfo):
path = dirInfo.DirectoryName.replace(currentDir, "")
return path

def main(source, target):
myFiles = System.IO.DirectoryInfo(source).GetFiles("*.*", System.IO.SearchOption.AllDirectories)
print "Files: %s" %len(myFiles)
for file in myFiles:
relativePath = getRelativePathNET(source, file)
targetFullName = target + relativePath + "\\" + file.Name
if not System.IO.File.Exists(targetFullName):
print "source: %s\ntarget: %s\n\n" %(file.FullName, targetFullName)
if not System.IO.Directory.Exists(target + relativePath):
System.IO.Directory.CreateDirectory(target + relativePath)
System.IO.File.Copy(file.FullName, targetFullName)
else:
print "Already Exists: %s\n\n" %file.Name

#source = r"C:\Users\(user name)\Videos"
#target = r"F:\My Videos"
if len(sys.argv) == 3:
main(sys.argv[1], sys.argv[2])
else:
print "ex: ipy.exe ACopy.py 'source directory' 'target directory'"
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。