40
exclude_names = set(['.svn', '.bzr'])
42
def align_up(size, alignment):
43
"Return size aligned up to alignment"
45
if (size % alignment == 0):
48
return ((size // alignment) + 1) * alignment
50
41
def subtree_size(root, cluster_size, dirent_size):
51
42
"Recursive directory walk and calculate size"
56
for name in os.listdir(root):
57
canon = os.path.join(root, name)
59
if (os.path.isfile(canon) and (not name in exclude_names)):
60
size += align_up(os.path.getsize(canon), cluster_size)
47
for item in listdir_items(root):
49
size += align_up(item.size, cluster_size)
63
if (os.path.isdir(canon) and (not name in exclude_names)):
64
size += subtree_size(canon, cluster_size, dirent_size)
52
size += subtree_size(item.path, cluster_size, dirent_size)
67
55
return size + align_up(files * dirent_size, cluster_size)
72
60
return len(os.listdir(root))
74
def write_file(path, outf, cluster_size, data_start, fat, reserved_clusters):
62
def write_file(item, outf, cluster_size, data_start, fat, reserved_clusters):
75
63
"Store the contents of a file"
77
size = os.path.getsize(path)
81
inf = open(path, "rb")
68
for data in chunks(item, cluster_size):
84
69
empty_cluster = fat.index(0)
85
70
fat[empty_cluster] = 0xffff
92
77
prev = empty_cluster
94
data = bytes(inf.read(cluster_size));
95
79
outf.seek(data_start + (empty_cluster - reserved_clusters) * cluster_size)
82
return first, item.size
102
84
def write_directory(directory, outf, cluster_size, data_start, fat, reserved_clusters, dirent_size, empty_cluster):
103
85
"Store the contents of a directory"
303
285
empty_cluster = 0
305
for name in os.listdir(root):
306
canon = os.path.join(root, name)
308
if (os.path.isfile(canon) and (not name in exclude_names)):
309
rv = write_file(canon, outf, cluster_size, data_start, fat, reserved_clusters)
310
directory.append(create_dirent(name, False, rv[0], rv[1]))
312
if (os.path.isdir(canon) and (not name in exclude_names)):
313
rv = recursion(False, canon, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, empty_cluster)
314
directory.append(create_dirent(name, True, rv[0], rv[1]))
287
for item in listdir_items(root):
289
rv = write_file(item, outf, cluster_size, data_start, fat, reserved_clusters)
290
directory.append(create_dirent(item.name, False, rv[0], rv[1]))
292
rv = recursion(False, item.path, outf, cluster_size, root_start, data_start, fat, reserved_clusters, dirent_size, empty_cluster)
293
directory.append(create_dirent(item.name, True, rv[0], rv[1]))
317
296
outf.seek(root_start)