File Exchange Pick of the Week

Our best user submissions

Avoid Overwriting Files!

Brett's Pick this week is Avoid file overwrite, by Simon Musall.


A cautionary tale

Some years ago, I did something so boneheaded that it still pains me to think about today. After returning from a once-in-a-lifetime safari in Namibia with a thumb drive full of thousands of photographs, and I set about downloading the images to my hard drive with a snippet of code that I whipped together in MATLAB.

I plugged the thumb drive into a carrier, and in a for-loop, I started extracting the images, writing them to disk, and deleting them from the thumb drive as I went! Much to my dismay, I soon discovered that I had neglected to change the filenames, and that each image was overwriting its predecessor. D'Oh!

After much anguish, I was ultimately able to recover most of the images from the thumb drive--but I think I aged a decade on that day! Consider how easy it is to make this horrific mistake:

imds = imageDatastore(fullfile(matlabroot, 'toolbox', 'matlab', 'imagesci'), ...
    'FileExtensions', {'.tif', '.png'});
numFiles = numel(imds.Files)
% Create a write directory
writeDir1 =  fullfile(userpath, 'Test1');
if ~exist(writeDir1, 'dir')
for ii = 1:numFiles
    img = readimage(imds, ii);
    imwrite(img, fullfile(writeDir1, 'Oops.png'));

% Notice that while I _intended_ to write two files, I actually only end up
% with one--the last one! (The first image was overwritten!!!)
numFiles =

.         ..        Oops.png  


Now try again with Simon's avoidOverwrite: Create a second write directory

writeDir2 =  fullfile(userpath, 'Test2');
if ~exist(writeDir2, 'dir')
for ii = 1:numFiles
    img = readimage(imds, ii);
    fn = avoidOverwrite('Oops.png', writeDir2, 2, 1)
    imwrite(img, fullfile(writeDir2, fn))
fn =
fn =

.            ..           Oops.png     Oops_01.png  

With the benefit of hindsight, avoidOverwrite would have saved me a great deal of anguish! (Of course, if I had been thinking of this potential failure mechanism, I would have avoided it from the start. But that's a story for another day!)

As always, I welcome your thoughts and comments.

Published with MATLAB® R2020b

  • print


コメントを残すには、ここ をクリックして MathWorks アカウントにサインインするか新しい MathWorks アカウントを作成します。