Как принудительно использовать уникальные имена файлов на Google Диске?

#python #flysystem-google-drive

#python #flysystem-google-drive

Вопрос:

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

Есть ли какой-либо способ предотвратить это?

Все мои скрипты используют один и тот же код для доступа к Drive API для загрузки файлов:

 import os
import httplib2
from apiclient import discovery, errors
from apiclient.http import MediaFileUpload

credentials = get_google_drive_credentials()
service = discovery.build('drive', 'v2', http=credentials.authorize(httplib2.Http()))

dir_id = 'google_drive_folder_hash'
filename = '/some/path/blah.txt'
service.files().insert(
    body={
        'title': os.path.split(filename)[-1],
        'parents': [{'id': dir_id}],
    },
    media_body=MediaFileUpload(filename, resumable=True),
).execute()
  

Если бы два или более скриптов запускали это, и при условии отсутствия условий гонки, почему этот код привел бы к дублированию загрузок «blah.txt «? Как бы мне предотвратить это?

Ответ №1:

  • При создании файла требуется указать только одно имя файла в папке.
  • Когда дублированное имя файла существует, вы не хотите создавать файл.
  • Вы хотите использовать Drive API v2.

Если я правильно понимаю, как насчет этого ответа? В этом ответе добавлен процесс поиска дублированного имени файла в папке. Для этого я использовал файлы.метод списка. Последовательность выполнения этого скрипта следующая.

  1. Извлеките файлы title из папки.
  2. Если дублированное имя файла НЕ существует, создается новый файл.
  3. Если дублированное имя файла существует, новые файлы НЕ создаются.

Пример сценария:

 res = service.files().list(q="title='"   title   "' and '"   dir_id   "' in parents", fields="items(id,title)").execute()
if len(res['items']) == 0:
    # In this case, no duplicated filename is existing.
    service.files().insert(
        body={
            'title': title,
            'parents': [{'id': dir_id}],
        },
        media_body=MediaFileUpload(filename, resumable=True),
    ).execute()
else:
    # In this case, the duplicated filename is existing.
    # Please do error handling here, if you need.
    print("Duplicated files were found.")
  

Примечание:

  • Этот модифицированный скрипт предполагает, что вы уже использовали Drive API.

Ссылки:

Если я неправильно понял ваш вопрос и это был не тот результат, который вы хотите, я приношу извинения.