5

ランダムな順序で到着する断片でバイナリ ファイルをコンパイルする必要があります (はい、P2P プロジェクトです)。

def write(filename, offset, data) 
    file.open(filename, "ab")
    file.seek(offset) 
    file.write(data) 
    file.close()

ファイルへのオフセット1MBで32KBの書き込み(f、o、d)があり、次にオフセット0で別の32KBの書き込み(f、o、d)があるとします

最終的に 65KB の長さのファイルになります (つまり、32KB と 1MB の間の 0 で構成されるギャップは切り捨てられます/消えます)

これは信じられないほどばかげた質問に見えるかもしれませんが、file.open(..)モードからは理解できないようです

ありがたいアドバイスをいただきました。

*** アップデート

P2P作品を書く私の方法は次のようになりました(そこから何らかの価値を得るかもしれない人のために)

def writePiece(self, filename, pieceindex, bytes, ipsrc, ipdst, ts): 
    file = open(filename,"r+b")
    if not self.piecemap[ipdst].has_key(pieceindex):
        little = struct.pack('<'+'B'*len(bytes), *bytes) 
        # Seek to offset based on piece index 
        file.seek(pieceindex * self.piecesize)
        file.write(little)
        file.flush()
        self.procLog.info("Wrote (%d) bytes of piece (%d) to %s" % (len(bytes), pieceindex, filename))

    # Remember we have this piece now in case duplicates arrive 
    self.piecemap[ipdst][pieceindex] = True
    file.close()

注: struct.pack を使用して、しばらく悩まされていたいくつかのエンディアンの問題にも対処しました。

不思議に思っている人のために、私が取り組んでいるプロジェクトは、ネットワークから直接キャプチャされた BT メッセージを分析することです。

4

4 に答える 4

7
>>> import os
>>> filename = 'tempfile'
>>> def write(filename,data,offset):
...     try:
...         f = open(filename,'r+b')
...     except IOError:
...         f = open(filename,'wb')
...     f.seek(offset)
...     f.write(data)
...     f.close()
...
>>> write(filename,'1' * (1024*32),1024*1024)
>>> write(filename,'1' * (1024*32),0)
>>> os.path.getsize(filename)
1081344
于 2010-08-04T16:30:33.340 に答える
4

追加 ( "a") モードでファイルを開きました。への呼び出しに関係なく、すべての書き込みはファイルの最後に行われますseek()

于 2010-08-04T16:20:31.377 に答える
0

「ab」ではなく「r+b」を使用してみてください。

于 2010-08-04T16:25:16.923 に答える
0

ファイルのすべての部分がそこにあるまで、ファイルをアセンブルしようとしてもあまり意味がないように思えます。すべてが揃うまでピースを分けておき、最終ファイルに順番に書き込んでみませんか? これは、ほとんどの P2P アプリが行うことです。

于 2010-08-04T18:27:11.670 に答える