Windows错误:[错误183] 当该文件已存在时无法创建文件

3
我正在使用以下脚本为传递的第一个参数中的所有目录和子目录中的所有文件添加版权信息,但运行以下命令时遇到以下错误... 有人能提供修复方法吗?
错误:-
C:\Dropbox\copyrights>python Add_copyright.py .
Traceback (most recent call last):
  File "Add_copyright.py", line 69, in <module>
    prepend_file(fullname, dirpath)
  File "Add_copyright.py", line 60, in prepend_file
    os.rename(temp_fname, fullname)
WindowsError: [Error 183] Cannot create a file when that file already exists

代码:-

import fnmatch
import os
import shutil
import sys
import tempfile

file_patterns_to_match = ['*.c','*.h','*.cpp','*.txt']

headertext = """/*
 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
 *
 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
 *
 *
 * Permission to use, copy, modify, and/or distribute this software for
 * any purpose with or without fee is hereby granted, provided that the
 * above copyright notice and this permission notice appear in all
 * copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */
"""

# make any newlines in headertext match the system line ending
headertext = headertext.replace('\n', os.linesep)

def want_this_file(fname):
    for pat in file_patterns_to_match:
        if fnmatch.fnmatch(fname, pat):
            return True
    return False

def prepend_file(fullname, path):
    # with statement means temp file is written and closed at end of with
    with tempfile.NamedTemporaryFile(dir=path, delete=False) as out_file:
        # get the name immediately
        temp_fname = out_file.name

        try:
            # use binary mode to avoid newline translations
            with open(fullname, "rb") as in_file:
                out_file.write(headertext)
                shutil.copyfileobj(in_file, out_file)
        except Exception:
            # on any error, clean up temp file and re-raise exception
            try:
                os.remove(temp_fname)
            except Exception:
                print("unable to clean up temp file: " + temp_fname)
                pass
            raise
    # rename temp file to fullname, clobbering original
    os.rename(temp_fname, fullname)


start_directory = sys.argv[1]

for dirpath, dirnames, filenames in os.walk(start_directory):
    for fname in filenames:
        if want_this_file(fname):
            fullname = os.path.join(dirpath, fname)
            prepend_file(fullname, dirpath)

6
在Windows上进行文件输入输出真是太麻烦了,不直观且不一致。 - Erik Kaplun
1个回答

3
如果你想要追加到一个已存在的文件中,你需要像这样使用:
with open(fullname, "ab") as in_file

问:你确定可以使用shutil.copyfileobj(in_file, out_file)与已经写入过的out_file吗?
问:你知道哪一行代码导致了Windows错误吗?
感谢您的更新。
我敢打赌你的目录中已经有一个名为fullname的文件,因此os.rename(temp_fname, fullname)会出现“文件已存在”的错误。
问:使用shutil.move是否可行?

Q: 你是否能通过确保以下两种方式之一来解决问题:1)在重命名临时文件之前,确保文件不存在;或者2)使用“移动”而不是“重命名”,以覆盖原始文件? - paulsm4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接