import os
import os.path
for dirpath, dirnames, filenames in os.walk("."):
for filename in [f for f in filenames if f.endswith(".RTON")]:
print(os.listdir(os.path.join(filename)))
a = os.path.join(filename)
例如:在我的文件夹中,我有100个文件,想要将它们打包在一起并获取每个文件的偏移量。
packed_file = file1 + file2 + file3...+ file100
生成的二进制文件应该是1个文件,其中包含打包到其中的所有其他文件的数据。打个比方是tarball
简单文件表
由于您可以选择以任何方式写入(然后从中读取)二进制文件,因此可以根据需要设置此映射。您只需要决定如何使数据代表文件结构即可。
一种相对简单的方法可能是使用文件中的前几个字节作为计数器(我称其为N),它告诉您打包文件中总共包含多少个源文件,然后使用下一个N * 4或N * 8字节,表示打包文件中可以找到每个源文件的位置。然后在4 + N * 4(或8 + N * 8,或其他)字节之后,接下来可以一次放置一个文件。如果要包含文件名,可以将名称放在文件数据之前的位置。
一个用例:
我有5个源文件要存储到您的大包装文件中:
number-files = read the first 4-byte integer
N = 1..number-files
location[N] = read a 4-byte integer from location N
name-length[N] = read a 4-byte integer from location location[N]
file-names[N] = read text string: name-length[N] bytes at location[N]+4
然后,要读取文件的数据(N是数字):
N = pick-a-file-any-file(file-names) file-location = read integer at location N file-data-location = file-location + 4 + (read integer at location file-location) data-length = read integer at file-data-location data = read data-length bytes from location (file-data-location + 4)
并且所选文件的文件数据将在“数据”中。改进
注意:这是
不是处理文件表的最有效方法。这只是我认为可能最容易理解和遵循的逻辑。
有许多更有效的方法来处理文件结构。如何优化表取决于要优化的内容。如果您需要最大速度浏览庞大的文件表,则表中可能包含以下内容:文件数(N)
[某些系统使用的另一种改进是仅从以4096整除的位置开始文件的数据:因此,文件1的数据可以位于4096位置,文件2的数据可以位于8192,依此类推。)由于从磁盘读取数据的方式。
当然,如果您有很多小文件,那么您不希望它们全部基于4096对齐,否则您的文件可能比需要的大数千倍。因此,另一个改进是在文件中具有不同的部分,其中的一些部分是4096对齐的,而有些则没有。在上面的用例中,有5个小文件(最大10个字节),您希望它们全部位于同一磁盘扇区中。但是,如果您有任何大文件,将它们对齐到4096可分割的位置将很有意义。
[您如何处理1个文件的末尾与下一个文件的开始之间的其余空间(即:如果将“ abcdefg”保存为4096,并将gfedcba保存为8192,那么您如何处理来自4104至8191)?那是死空间,您只需将其全部设置为一堆零即可。是的,它浪费了,这就是为什么您不想只对大文件执行此操作的原因。
更新文件
如果要在适当位置编辑文件,则需要以一种易于容纳此类更改的方式保存数据。例如,如果我们将文件数据对齐到前面提到的4096个可分割的位置,那么我们将剩下大量的死区,还有足够的空间来容纳此更改。
或者,您可以重新排列一些数据以容纳它。您可以将下一个文件移到文件末尾并使用其一些空间。这变得越来越复杂,不是吗?
一种简单的更新文件的方法是每次更新时都重新创建它;甚至不必费心尝试更改文件的一小部分,每次都覆盖整个内容。对于巨大的文件结构,这可能会花费很多时间,但是对于不需要很好缩放的小型文件结构,它可以工作。
碎片整理
如果您在文件中移动足够多的内容,最终文件数据可能会无处不在,如果您将内容移动足够多,则可能会有很多死区。最终可能会产生大量开销。
如果您要继续沿着这条路径进行优化,下一步将是改进用于移动内容的算法,或者实施碎片整理算法来修复文件的低效率。
如您所见,沿着这条路径进行优化越来越令人头疼。因此,如果不需要,通常不会完成。
摘要