2014-09-04 2 views
0

Я написал сценарий для резервного копирования файлов. Однако я только что столкнулся с проблемой. Это редко будет проблемой, но в случае, если я хочу предотвратить ненормальное поведение.Предотвращение сбоя сценария при ошибке разрешений

скрипт проверяет файлы в одном каталоге, а затем проверяет их в другом, все, что существует в первом, но не во втором, копируются, поэтому их резервное копирование.

Однако я просто попытался его один из файлов, копировать открыт в Excel, сценарий возвратил ошибку:

IOError: [Errno 13] Permission denied: 'C:\\dev\\DailyStatistics\\September\\~$Update Rates 050914.xlsx' 

Я ожидаю, что это потому, что она была открыта в то время.

Как я могу изменить мой сценарий так, что если это произойдет, это вызывает эту команду:

print "One or more of the files you tried to backup were open. Please save and close the document and try again" 

Это является частью сценария, который копирует файлы:

for file in source_files: 
filename = file[-11:-1] 
year = filename[-6:-4] 
foldername = directory_mapping[filename[-8:-6]] 
if not os.path.exists("W://20" + year + '/' + foldername + "/"): 
    os.makedirs("W://20" + year + '/' + foldername + '/') 
if filename not in bfiles: 
    shutil.copy(file, 'W://20' + year + '/' + foldername + '/') 
    files_transferred = files_transferred + 1 

EDIT:

Ответ Джона Звинка ниже, действительно, работает. Однако я посмотрел немного глубже в проблему и понял, что, пока ошибка поднимается, файл фактически переносится.

Я удалил все файлы из резервной копии, а затем открыл 2 исходных файла, чтобы проверить блок try/except.

За исключением обработанных и я получил 2 сообщения об ошибках, но перед закрытием документов и попыткой снова проверяю файл назначения, и оба файла там с правильным размером.

Почему python выбрасывает эту ошибку, если файлы фактически передаются правильно.

UPDATE:

Причины проблемы, описанная выше, была из-за того, как окна запирали файл. Excel создает скрытый файл, когда он имеет что-то открытое. Поскольку этот файл также соответствовал шаблону, который он пытался также скопировать.

Ошибка была вытащена на скрытый файл «темп», а не на фактический открытый файл.

Чтобы обойти это, я изменил свой метод сопоставления.

Он соответствует только файлам, заканчивающимся .xlsx и начинающихся с ~$. Это устранило проблему, поскольку теперь она игнорирует скрытые файлы!

ответ

2
try: 
    shutil.copy(file, 'W://20' + year + '/' + foldername + '/') 
except IOError as ex: 
    print ex, "Please save and close the document and try again" 
+0

Это прекрасно работает, но я заметил что-то другое. Если вы не возражаете, см. Править. –

0

Используйте примерочных, за исключением блока:

try: 
    shutil.copy(file, 'W://20' + year + '/' + foldername + '/') 
except IOError: 
    print "One or more of the files you tried to backup were open. Please save and close the document and try again" 
Смежные вопросы