服务账号如何恢复并删除Google Drive共享文件夹中被删文件
问题原因
服务账号创建的文件所有权默认归属服务账号本身,当共享文件夹内的普通用户删除这类文件时,仅会移除文件在当前共享文件夹下的关联关系,不会将文件移入任何账号的回收站——普通用户没有权限删除其他账号(含服务账号)所有的文件。
这类被移除所有父目录关联的文件会成为服务账号名下的孤立文件,不会出现在服务账号默认的文件列表、回收站列表中,但仍会持续占用服务账号的存储配额,这就是你看到usageInDriveTrash为0但存储空间未释放的核心原因。
操作步骤
1. 定位占空间的孤立文件
你不需要记得原文件ID,直接通过服务账号遍历名下所有非回收站文件,筛选无父目录的大体积文件即可定位目标。参考代码如下:
from googleapiclient import discovery from oauth2client.service_account import ServiceAccountCredentials scope = ["https://www.googleapis.com/auth/drive"] credentials = ServiceAccountCredentials.from_json_keyfile_name( filename="my-key.json", scopes=scope ) service = discovery.build("drive", "v3", credentials=credentials) # 拉取服务账号所有未进回收站的文件,返回必要字段 results = service.files().list( q="'me' in owners and trashed = false", fields="files(id,name,size,parents,createdTime,mimeType)", includeItemsFromAllDrives=True, supportsAllDrives=True, pageSize=1000 ).execute() all_files = results.get('files', []) # 筛选孤立文件(无父目录关联) orphan_files = [f for f in all_files if 'parents' not in f or len(f['parents'])==0] for f in orphan_files: # 你之前上传的是zip文件、体积约9G左右,很容易匹配 print(f"找到孤立文件:名称{f['name']},ID:{f['id']},大小:{int(f['size'])/1024/1024/1024:.2f}G,创建时间:{f['createdTime']}")
执行后你会拿到所有孤立文件的信息,匹配你之前上传的test.zip的创建时间、大小,就能拿到对应的file_id。
2. 清理文件释放空间
拿到目标文件ID后,直接调用永久删除接口即可,不需要先恢复文件:
target_file_id = "替换为你上一步找到的文件ID" service.files().delete( fileId=target_file_id, supportsAllDrives=True ).execute()
接口返回成功后等待1~3分钟,再查询存储配额就能看到占用空间已经释放。
如果你需要先确认文件内容再删除,可以先把文件移回你有权限访问的目录,确认无误后再执行删除:
# 把孤立文件移回指定共享文件夹,folder_id替换为你可访问的文件夹ID service.files().update( fileId=target_file_id, addParents="folder_id", supportsAllDrives=True ).execute()
额外注意
你之前的上传代码中file_metadata同时写了title和name字段,Drive API v3版本仅识别name字段,title是v2版本的遗留参数,后续开发可以移除该冗余字段避免异常。
内容的提问来源于stack exchange,提问作者Tai Lu
相关产品推荐
相关产品推荐

