我的Dropbox中有一个包含30,000个文件的文件夹,我无法使用网络界面删除。看来我必须下载所有30,000个文件才能告诉dropbox我真的不想要它们。
出现此错误是因为最初拥有这些文件的计算机已经消失,我正在使用选择性同步来避免将30,000个文件下载到我的所有其他计算机。
有人能想出一个聪明的方法来解决这个问题吗?只是查看文件夹通常会导致Web界面崩溃。
答案 0 :(得分:8)
删除文件夹中30,000多个文件的唯一方法是使用选择性同步下载它们。 Web界面将提供“太多文件请使用桌面应用程序”错误。它是自动化的,因此唯一需要的是时间(以及足够的硬盘空间)。如果没有足够的空间,请插入外部驱动器并在那里重新指定Dropbox目录,让它下载,然后删除。
这是一个愚蠢的问题,我知道。我希望您可以通过Web界面管理更多,因为这是您的文件的中心位置。
答案 1 :(得分:1)
我知道这有点迟了,但是对于其他任何偶然遇到这个问题且有同样问题的人......我的问题特别是我有数百个不再需要的文件只在Dropbox服务器和我不想清除硬盘只是为了能够通过选择性同步删除它们。
仍然无法从网络界面删除那么多文件,但是如果你不介意潜入Dropbox API这至少可以自动化,你不必使用自己的存储(我在下面使用Python SDK执行了此操作,但还有其他语言选项)。文件限制仍然适用,但可以计算每个目录中的文件数,以确定删除它们的正确方法,而不会遇到问题。像这样:
以下脚本将您的唯一Dropbox API密钥和Dropbox目录列表(deleteDirList
)作为输入。然后循环遍历deleteDirList
的每个元素的每个子目录,以确定是否有足够的文件能够删除目录而不达到限制(我将限制设置为保守的(?)10,000个文件);如果文件太多,则会单独删除文件,直到计数低于限制。您需要安装Python包dropbox
(我使用Anaconda,所以conda install dropbox
)
请记住,这是一种蛮力的方法;每个子目录都会逐个删除,这可能需要很长时间。一个更好的方法是计算每个子目录中的文件,然后确定可以在不达到限制的情况下删除的最高级别目录,但遗憾的是我现在没有时间实现它。
import dropbox
##### USER INPUT #####
appToken = r'DROPBOX APIv2 TOKEN'
deleteDirList = ['/directoryToDelete1/','/directoryToDelete2/'] # list of Dropbox paths in UNIX format (where Dropbox root is specified as '/') within which all contents will be deleted. The script will go through these one at a time. These need to be separate directories; subdirectories will deleted in the loop and will throw an exception if listed here.
######################
dbx = dropbox.Dropbox(appToken)
modifyLimit = 10000
# Loop through each path in deleteDirList
for deleteStartDir in deleteDirList:
deleteStartDir = deleteStartDir.lower()
# Initialize pathList. This is the variable that records all directories down each path tree so that each directory is traversed, files counted, then deleted
pathList = [deleteStartDir]
# Deletion loop
try:
while 1:
# Determine if there is a subdirectory in the current directory. If not, set nextDir=False
nextDir = next((x.path_lower for x in dbx.files_list_folder(pathList[-1]).entries if isinstance(x,dropbox.files.FolderMetadata)),False)
if not not nextDir: # if nextDir has a value, append the subdirectory to pathList
pathList.append(nextDir)
else: # otherwise, delete the current directory
if len(pathList)<=1: # if this is the root deletion directory (specified in deleteDirList), delete all files and keep folder
fileList = [x.path_lower for x in dbx.files_list_folder(pathList[-1]).entries]
print('Cannot delete start directory; removing final',len(fileList),'file(s)')
for filepath in fileList:
dbx.files_delete(filepath)
raise EOFError() # deletion script is complete
# Count the number of files. If fileCnt>=modifyLimit, remove files until fileCnt<modifyLimit, then delete the remainder of the directory
fileCnt = len(dbx.files_list_folder(pathList[-1]).entries)
if fileCnt<modifyLimit:
print('Deleting "{path}" and'.format(path=pathList[-1]),fileCnt,'file(s) within\n')
else:
print('Too many files to delete directory. Deleting',fileCnt-(modifyLimit+1),'file(s) to reduce count, then removing',pathList[-1],'\n')
fileList = [x.path_lower for x in dbx.files_list_folder(pathList[-1]).entries]
for filepath in fileList[-modifyLimit:]:
dbx.files_delete(filepath)
dbx.files_delete(pathList[-1])
del pathList[-1]
except EOFError:
print('Deleted all relevant files and directories from "{}"'.format(deleteStartDir))