2

私はPythonを初めて使用するので、これで簡単な解決策が得られる可能性があります。

私の家には、この状況に関連する3台のコンピューターがあります。-ファイルサーバー(Linux)-メインPC(Windows)-ガールフレンドのMacBook Pro

私のファイルサーバーはubuntuとsambaを実行しています。Python 3.1をインストールし、3.1でコードを記述しました。

特定のパターンに従うuploadsディレクトリに特定のファイルがいつ存在するかを判断するデーモンを作成しました。そのようなファイルを見つけると、名前を変更し、別のドライブの別の場所に移動します。また、所有者、グループ、および権限を書き換えます。これはすべてうまく機能します。このプロセスは毎分実行されます。

メインのPCからファイルをコピーする場合(Windowsのフレーバーを実行している場合)、プロセスは常に機能します。(Windowsは、コピーが完了するまでファイルをロックすると思います。間違っている可能性があります。)ガールフレンドがファイルをコピーすると、コピーが完了する前にファイルが取得され、問題が発生します。(不適切な権限を持つ下線付きのバージョンのファイルが作成され、ファイルが正しい場所に配置されることがあります)ここでは、彼女のMacBookがコピー時にファイルをロックしないと推測しています。私もそこで間違っている可能性があります。

私が必要としているのは、使用中のファイル、または作成されていないファイルを除外する方法です。

参考までに、ファイルを見つけるために作成した方法は次のとおりです。

# _GetFileListing(filter)
# Description: Gets a list of relevant files based on the filter
#
# Parameters: filter - a compiled regex query
# Retruns:
#   Nothing. It populates self.fileList
def _GetFileListing(self, filter):
    self.fileList = []
    for file in os.listdir(self.dir):
        filterMatch = filter.search(file)
        filepath = os.path.join(self.dir, file)

        if os.path.isfile(filepath) and filterMatch != None:
            self.fileList.append(filepath)

これはすべてクラス内にあることに注意してください。

ファイルを操作するために私が作成した方法は次のとおりです。

# _ArchiveFile(filepath, outpath)
# Description: Renames/Moves the file to outpath and re-writes the file permissions to the permissions used for
#   the output directory. self.mask, self.group, and self.owner for the actual values.
#
# Parameters: filepath - path to the file
#             outpath - path to the file to output
def _ArchiveFile(self, filepath, outpath):
    dir,filename,filetype = self._SplitDirectoryAndFile(outpath)

    try:
        os.makedirs(dir, self.mask)
    except OSError:
        #Do Nothing!
        dir = dir

    uid = pwd.getpwnam(self.owner)[2]
    gid = grp.getgrnam(self.group)[2]
    #os.rename(filepath, outpath)
    shutil.move(filepath, outpath)
    os.chmod(outpath, self.mask)
    os.chown(outpath, uid, gid)

別のドライブにファイルを移動し始めたときにos.renameが機能しなくなったように見えるため、os.renameの使用を停止しました。

ショートバージョン:現在転送中のファイルが検索で取得されないようにするにはどうすればよいですか?

あなたが提供できるかもしれないどんな助けにも前もって感謝します。

4

3 に答える 3

0

ファイルを移動する前に、ファイルに対して排他的書き込みロックを取得してみることができます。これは、fcntlモジュールを使用して実行できます。

http://docs.python.org/library/fcntl.html

それを除けばlsof、システムが開いているファイルを表示するユーティリティを使用できます。それにはもっと骨の折れる作業が必要です。

os.rename()は同じファイルシステムで機能し、実際にはこの問題の影響を受けないことに注意してください(iノードは移動され、データは移動されません)。shutilを使用するとmv、同じファイルシステムの場合はファイルを再リンクするか、ファイルシステムが異なる場合はコピーして削除します。

于 2010-11-05T22:43:01.123 に答える
0

書き込みロックアプローチが機能しなかったことが判明しました。ここで更新する前に、適切にテストしなかったと思います。

今のところ私がやることに決めたのは:

  • チェック間の時間を30秒に短縮します
  • 前の反復で見つかったファイルとそれぞれのファイルサイズのリストを保持します
  • 古いリストに対して新しいファイルのリストを確認します

新しいリストに古いリストと同じファイルサイズの同じファイルが含まれている場合は、転送するリストに入れてください。新しいリストの残りのファイルは古いリストになり、プロセスが続行されます。

lsofメソッドは機能すると確信していますが、Pythonでの使用方法がわかりません。また、ファイルの転送中にファイルを移動しないことに主に関心があるため、この方法は私の状況では非常にうまく機能するはずです。

また、「。_」で始まるすべてのファイルを除外する必要があります。これは、Macがそれらを作成し、時間の経過とともにサイズが大きくなるかどうかわからないためです。

または、彼女のMacによって転送されている場合のみを処理するオプションがあります。Macがファイルを転送しているときに、次のものが作成されることを知っています。

  • filename.ext
  • ._filename.ext

リストの前に._が付いているファイル名のすべてのインスタンスを確認し、その方法でファイルを除外することができます。

おそらく最初に2番目のオプションを試してみます。少し汚れていますが、うまくいけばうまくいきます。

于 2010-11-08T21:08:11.850 に答える
0

Macの._ファイルにはリソースフォークが含まれています。詳細については、http ://support.apple.com/kb/TA20578をご覧ください。

コメントをするのに十分な担当者がいないので、答えがあります。

とにかく他のOSはおそらく何もできないので、ほとんどの場合、それらを無視しても問題ありません。詳細については、こちらをご覧ください:http: //en.wikipedia.org/wiki/Resource_fork

于 2010-11-08T21:18:25.053 に答える