首页 > 解决方案 > 如果文件夹已经存在,则不允许用户使用 os 模块创建文件夹

问题描述

我正在尝试制作一个添加课程表单,其中管理员将在文本框中写入课程名称,然后将创建该名称的文件夹。但是如果课程已经存在,那么它会发送一条错误消息,例如“课程已经存在”。这是我尝试过的

string=tk.StringVar()
label1=tk.Label(frame,text="Enter Course Name:",font=20,bg="#33BEFF")
label1.place(relx=0.25,rely=0.27)
coursetxt=ttk.Entry(frame,textvariable=string,text="")
coursetxt.place(relx=0.52,rely=0.27)

def addcourse():
    name=coursetxt.get()
    conn = pyodbc.connect('Driver={SQL Server};''Server=SHUMAILA\SHUM;''Database=FYP;''Trusted_Connection=yes;')
    cursor=conn.cursor()
    cursor.execute('insert into course(cname)values(?)',(name))
    courses_f=os.chdir('G:\Shumaila\FYP\FYP\courses')  #path where course folder are saved
    course_folder=os.mkdir(name)  #for creating course folder
    if course_folder.path.exists in courses_f:
        messagebox.showinfo("Message","Course is already exist")
    else:
        messagebox.showinfo("Message","Course is added")
        course_folder=os.mkdir(name)


addbutton=tk.Button(frame,text="Add",bg='#FF6E33',command=addcourse)
addbutton['font']=myFont
addbutton.place(relx=0.40,rely=0.35,relwidth=0.20,relheight=0.10)

运行代码后,它给了我这个错误

FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'E1'
where E1 is the name of course I entered in textbox

我希望这条消息将打印在一个消息框中。

我也试试这个,但它也不起作用

     if name in os.chdir('G:\Shumaila\FYP\FYP\courses'):
        messagebox.showinfo("Message","Course is already exist")
     else:
        os.mkdir(name)
        messagebox.showinfo("Message","Course is added")

标签: pythonuser-interfacemoduleduplicatesoperating-system

解决方案


我们来谈谈os.mkdir()

mkdir创建具有给定路径的目录。如果路径是相对的,它将相对于当前工作目录创建它。我会避免这种情况,并使用完整路径。

(为什么?因为当前工作目录是全局的,改变它可能会影响代码的其他部分。)

mkdir总是返回无。

所以,当你打电话course_folder=os.mkdir(name)时,你只是将 course_folder 设置为 None。

当您引用course_folder.path不存在时。


我们来谈谈os.chdir()

chdir更改当前工作目录。

当前工作目录仅在您使用相对路径时才相关。您可能应该只使用完整路径,并且永远不要更改它。

chdir总是返回无。

所以当你设置courses_f=os.chdir([whatever])你设置courses_f为无。

同样,当您检查 if 时name in os.chdir([whatever]),您只是在检查name in None


你应该如何解决它?

调用. _ os.path.exists()_os.mkdir()

这可能存在竞争条件(其他人可以在两次调用之间创建文件),因此更好的方法可能是尝试创建它,并在失败时捕获异常。


推荐阅读