Перемещайте все файлы из одного каталога в другой с ограниченным дисковым пространством - PullRequest
0 голосов
/ 17 июня 2020

У меня есть смонтированный каталог, содержащий несколько больших файлов. Я хотел бы переместить эти файлы в локальный каталог. Однако на локальном компьютере очень ограниченное дисковое пространство, и я столкнулся с проблемой, когда перемещение этих файлов не удавалось из-за дискового пространства и впоследствии было потеряно. Я ищу pythoni c способ:

  1. Попытка переместить все файлы из исходного каталога в место назначения
  2. Если у нас заканчивается место, переместите их все назад и вызвать ошибку (или просто вернуть false) без изменения владельца или разрешений

Я не хочу перемещать сам каталог, только его содержимое. Можно перезаписать существующие файлы. Я вижу множество вопросов «Как переместить файлы», но не вопросов «Что произойдет, если у нас закончится место».

На локальном компьютере работает Centos 7, на удаленном - Solaris 10.

1 Ответ

1 голос
/ 17 июня 2020

Я думаю, что самый * pythoni c способ - перемещать кусок за фрагментом, проверяя наличие ошибок между ними. Я собираюсь предположить, что файл слишком велик, чтобы целиком храниться в памяти сразу, поэтому, вероятно, лучше всего будет что-то вроде этого:

chunk_size = 2048
successful = True

with f_in = open("original.file","rb"):
  chunk = f_in.read(chunk_size)#Only reads a small chunk of the old file at a time
  while chunk:
    try
      f_out = open("new_file","ab+")
      f_out.write(chunk) #Writes the small chunk to the end of the new file and 
      f_out.close()      #then closes it so as not to run out of memory
      chunk = f_in.read(chunk_size)
    except OSError as e:
      chunk = False
      successful = False
if successful:
  os.remove("original.file")

Я почти уверен, что это сработает для вас, так как вы закончили бы раньше в случае ошибки NOSP C, что означает, что у вас закончилось c пространство. Исходный файл будет удален только в том случае, если вы завершите запись (я предполагаю, что это было вашим намерением, поскольку вы хотели переместить его, а не скопировать).

Есть более простое решение - переименовать файл с помощью os.rename («старый / путь / файл.txt», «новый / путь / файл.txt»), но я не уверен на 100%, что это будет работать с смонтированным диском c на локальный диск c. Но, наверное, попробовать стоит.

...