我有一个脚本来计算文件夹中的文件数量,如果它小于最大数量,它会创建新文件,直到有正确的数字。理想情况下,删除旧文件时,应生成新文件。问题是,如果一次只删除一个文件,我的代码有时不会创建新文件。有时它会,有时它不会。如果一次删除多个文件,它将始终创建新文件。
import os
cfcount = 0
maxcalls = 7
run = 1
filecount = 0
def callFile(channel, maxretries, retrytime, waittime, context, ext):
#create sting
return callfile
def getCount():
"""Gets the number of callfiles in the directory"""
count = 0
files = os.listdir("c:\\proc")
for file in files:
if os.path.isfile("c:\\proc\\" + file):
count += 1
#print (count)
return count
run = 1
while run == 1:
"""main loop that runs until there's no more people left to call"""
filecount = getCount()
print (filecount)
lacking_filecount = maxcalls - filecount
while lacking_filecount > 0:
cfcount += 1
f = open("c:\proc\callfile" + str(cfcount) + ".call", 'w')
f.write(callFile("SIP/200", '0', '0', '45', "call-file-test", '200'))
f.close()
print ("Filecount: " + str(filecount))
print ("Callfile number: " + str(cfcount))
lacking_filecount -= 1
如果我保留print(filecount)语句,我每次都能正常工作。如果我删除该语句,它有时会起作用,有时则不起作用。
这是输出
>>>
0
Filecount: 0
Callfile number: 1
Filecount: 0
Callfile number: 2
Filecount: 0
Callfile number: 3
Filecount: 0
Callfile number: 4
Filecount: 0
Callfile number: 5
Filecount: 0
Callfile number: 6
Filecount: 0
Callfile number: 7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
7
没有print(filecount),它看起来像这样。它工作到大约9号,然后如果只删除了一个文件则退出替换新文件。请注意,它仍会打印一个调用文件编号。
>>>
Callfile number: 1
Callfile number: 2
Callfile number: 3
Callfile number: 4
Callfile number: 5
Callfile number: 6
Callfile number: 7
Callfile number: 8
Callfile number: 9
Callfile number: 10
Callfile number: 11
Callfile number: 12
这是getCount()循环内的print(文件)输出。它还没有与添加的印刷声明一起使用。
Callfile number: 17
callfile1.call
callfile17.call
callfile2.call
callfile3.call
callfile4.call
callfile5.call
callfile6.call
callfile1.call
callfile17.call
答案 0 :(得分:2)
似乎是正在创建的文件与显示在os.listdir()
输出中的文件之间的竞争条件。在大多数情况下,print语句可能需要 足够的时间在系统上“修复”它。
为什么不改变你的逻辑以便它只调用getCount()
一次,然后创建适当数量的文件?
filecount = getCount()
lacking_filecount = maxcalls - filecount
while lacking_filecount > 0:
# Create file...
lacking_filecount -= 1
此外,您似乎有一个无限循环,因为您从未在循环中设置run
。