【发布时间】:2015-08-10 04:36:07
【问题描述】:
要求
我必须尝试创建一个程序来删除所有损坏的图像(以及小于 400x400 的图像)并将其余图像过滤成 10,000 个组。
问题
目前,当我尝试删除任何“损坏”的图像时,它表示该文件当前正在被另一个进程使用,每个错误如下:
该进程无法访问该文件,因为它正被另一个进程使用。
采取的步骤
我尝试了多种方法来释放文件,包括使用“后退踏板”策略,应用程序移动到下一个图像,然后后退踏板尝试删除该图像,但它仍然保持打开状态。 如果我在 Python 打开时尝试手动删除图像,它会很高兴地通过。
请看下面的代码:
def confirmIt():
#======== Confirm Selection and Move files to new sub-directory:
if not folderPath.get() == "": ## make sure not blank
source = folderPath.get() ## set source path
size = 0
broken = False
for fname in os.listdir(source):
if fname.lower().endswith(extensions):
imageName = source+"\\"+fname ## set the source location of the image
try:
img = Image.open(imageName)
width, height = img.size ## get the dimensions
size = width * height / 1000
broken = False
img.close()
except IOError, e:
broken = True
img.close()
if ( broken == True ):
def handleRemoveReadonly(func, path, exc):
excvalue = exc[1]
if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
os.chmod(path, stat.S_IRWXU| stat.S_IRWXG| stat.S_IRWXO)
func(path)
else:
raise
try:
os.remove(imageName) ## Remove all remaining images that don't match the preset requirements (<400 and is an image)
额外信息
请注意,我也在使用 GUI,因此“resultMessage”和类似的输出/输入字段就是出于这个原因。
编辑:
在与@Cyphase 反复讨论后,我确定了问题所在。下降的帖子是由于我为他编辑了带有回溯的 OP。我并不真正使用这个论坛,因为我通常不需要编码。此应用程序的更多主题可能会出现。谢谢。
【问题讨论】:
-
您确定其他进程没有保持打开文件吗?另外,你为什么在 if 块中定义
handleRemoveReadonly(),而你甚至不使用它? -
错误消息来自哪个语句,
open、rmdir或remove? -
请注意,即使另一个进程正在使用该文件,删除也应该在 POSIX 下工作。也许你应该考虑用你正在使用的任何操作系统来标记它(我猜是 windows)。
-
看来你在微软下工作(我建议你使用
os.path.join而不是source+"\\"+fname),我不知道解锁文件的方法(可能使用ctypes和正确的系统调用)但是你可以use a tool like 和Process Explorer from Sysinternals 一样查看锁定它们的进程并尝试解决问题。 -
CFNZ_Technie 和@Cyphase,我已经回滚了关于图片上传大小限制的编辑。这是一个单独的问题,应该作为单独的问题提出。
标签: python image file-handling