diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2007-11-14 09:40:57 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2007-11-14 09:40:57 (GMT) |
commit | a42f40d57542edf6d3220156598465ccaaf9987a (patch) | |
tree | ed7749d2142d8898d49c25cacd4eebc16a23a4ff | |
parent | 00c586b2cad080fd7efac0abbfb148378d78385b (diff) |
#4784 Use valid FAT names when saving entries to usb sticks.
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | src/olpc/datastore/backingstore.py | 22 |
2 files changed, 15 insertions, 9 deletions
@@ -1,3 +1,5 @@ +* #4784 Use valid FAT names when saving entries to usb sticks. (tomeu) + Snapshot 6d3d607ec7 * #4783 Try harder to guess the file extension. (tomeu) diff --git a/src/olpc/datastore/backingstore.py b/src/olpc/datastore/backingstore.py index 9021448..4177e05 100644 --- a/src/olpc/datastore/backingstore.py +++ b/src/olpc/datastore/backingstore.py @@ -787,9 +787,13 @@ class InplaceFileBackingStore(FileBackingStore): completion(exc) def _get_unique_filename(self, suggested_filename): - filename = suggested_filename.replace('/', '_') - filename = filename.replace(':', '_') - filename = filename.replace('\n', '_') + # Invalid characters in VFAT filenames. From + # http://en.wikipedia.org/wiki/File_Allocation_Table + invalid_chars = ['/', '\\', ':', '*', '?', '"', '<', '>', '|', '\x7F'] + invalid_chars.extend([chr(x) for x in range(0, 32)]) + filename = suggested_filename + for char in invalid_chars: + filename = filename.replace(char, '_') # FAT limit is 255, leave some space for uniqueness max_len = 250 @@ -825,12 +829,12 @@ class InplaceFileBackingStore(FileBackingStore): # files to these devices we need to detect this case and # place the file proposed_name = props.get('filename', None) - if not proposed_name: - suggested = props.get('suggested_filename', None) - if suggested: - proposed_name = self._get_unique_filename(suggested) - if not proposed_name: - proposed_name = os.path.split(filelike.name)[1] + if proposed_name is None: + proposed_name = props.get('suggested_filename', None) + if proposed_name is None: + proposed_name = os.path.split(filelike.name)[1] + proposed_name = self._get_unique_filename(proposed_name) + # record the name before qualifying it to the store props['filename'] = proposed_name proposed_name = os.path.join(self.uri, proposed_name) |