当前位置: 首页 > 面试题库 >

如何打开(读写)或创建允许截断的文件?

万俟高峻
2023-03-14
问题内容

我想要:

  • 如果存在文件,则以读写模式打开它;
  • 如果不存在则创建它;
  • 能够随时随地截断它。

编辑 :用截断,我的意思是写到一个位置并丢弃文件的剩余部分(如果存在)

所有这些原子操作(一次open()调用或模拟一次open()调用)

似乎没有一种开放的方式适用:

  • r:显然不起作用;
  • r +:如果文件不存在,则失败;
  • w:重新创建文件(如果存在);
  • w +:重新创建文件(如果存在);
  • 答:看不懂;
  • a +:无法截断。

我尝试过的某些组合(rw,rw +,r + w等)似乎也不起作用。可能吗?

来自Ruby的一些文档(也适用于python):

r
Read-only mode. The file pointer is placed at the beginning of the file.
This is the default mode.

r+
Read-write mode. The file pointer will be at the beginning of the file.

w
Write-only mode. Overwrites the file if the file exists. If the file
does not exist, creates a new file for writing.

w+
Read-write mode. Overwrites the existing file if the file exists. If the
file does not exist, creates a new file for reading and writing.

a
Write-only mode. The file pointer is at the end of the file if the file
exists. That is, the file is in the append mode. If the file does not exist,
it creates a new file for writing.

a+
Read and write mode. The file pointer is at the end of the file if the file
exists. The file opens in the append mode. If the file does not exist, it
creates a new file for reading and writing.

问题答案:

根据OpenGroup:

O_TRUNC

如果文件存在并且是常规文件,并且文件已成功打开O_RDWR或O_WRONLY,则其长度将被截断为0,并且模式和所有者不变。它对FIFO特殊文件或终端设备文件没有影响。它对其他文件类型的影响取决于实现。O_TRUNC和O_RDONLY一起使用的结果是不确定的。

因此,用“ w”或“ w +”打开文件时可能会传递O_TRUNC。这给“截断”带来了不同的含义,而不是我想要的含义。

使用python,该解决方案似乎可以通过os.open()功能在低级I / O上打开文件。

以下python函数:

def touchopen(filename, *args, **kwargs):
    # Open the file in R/W and create if it doesn't exist. *Don't* pass O_TRUNC
    fd = os.open(filename, os.O_RDWR | os.O_CREAT)

    # Encapsulate the low-level file descriptor in a python file object
    return os.fdopen(fd, *args, **kwargs)

有我想要的行为。您可以像这样使用它(实际上是我的用例):

# Open an existing file or create if it doesn't exist
with touchopen("./tool.run", "r+") as doing_fd:

    # Acquire a non-blocking exclusive lock
    fcntl.lockf(doing_fd, fcntl.LOCK_EX)

    # Read a previous value if present
    previous_value = doing_fd.read()
    print previous_value

    # Write the new value and truncate
    doing_fd.seek(0)
    doing_fd.write("new value")
    doing_fd.truncate()


 类似资料:
  • 我有一个长约20万字节的大图像[]。 每当我试图创建blob/clob对象时 我试着把它打开 它还抛出异常,因为setBinaryStream()方法最多只能存储3000字节的数据,但不能超过这个字节。 我搜索并尝试了所有可能的解决方案。 将JDBC和ODBC JAR更新为最新的 还尝试了这个 我发现该应用程序不允许我实例化或设置BLOB/CLOB对象。 我使用的OJDBC4.jar和Oracle

  • 在 Dreamweaver 中创建、打开、编辑、保存和恢复文件。创建模板并打开相关的文件。 Dreamweaver 为处理各种 Web 文档提供灵活的环境。除了 HTML 文档以外,您还可以创建和打开各种基于文本的文档 - 如 JavaScript、PHP 和层叠样式表 (CSS)。 Dreamweaver 为创建新文档提供了几种选项。您可以创建以下任意文档: 新的空白文档或模板 基于 Dream

  • 本文向大家介绍如何使用PHPExcel打开Excel文件进​​行读写?,包括了如何使用PHPExcel打开Excel文件进​​行读写?的使用技巧和注意事项,需要的朋友参考一下 由于没有意识到PHPExcel对象的来源,因此没有在PHPExcel中打开文件进行读写的概念。不论从何处加载文件或文件类型,都可以根据文件名读取文件并以相同名称保存。这样,文件将被覆盖,新的更改将反映在文件中。 示例 输出结

  • 如果我试图写入脚本的目录或任何其他目录,则错误是相同的。权限似乎是对的。所有东西都是755,根所有者。我尝试将“my_custom_dir”所有者更改为www-data(apache用户),但没有任何区别。 它“死”在第一线。日志上的错误是“在/usr/lib/cgi-bin/script.cgi拒绝权限”

  • 问题内容: Qt5有一个新的JSon解析器,我想使用它。问题在于,对于函数在外行术语中的作用以及如何编写代码尚不清楚。那或者我可能读错了。 我想知道在Qt5中创建Json文件的代码以及“封装”的含义。 问题答案: 示例:从文件读取json 输出值 示例:从字符串读取json 将json分配给字符串,如下所示,并使用前面显示的功能: 输出值

  • 4.6.1.3 创建公共读写文件 这是一种文件用法,它允许未指定的大量应用的读写访问。 未指定的大量应用可以读写,意思不用多说了。 恶意软件也可以读取和写入,因此数据的可信度和安全性将永远不会得到保证。 另外,即使在没有恶意的情况下,也不能控制文件中的数据格式或写入的时间。 所以这种类型的文件在功能方面几乎不实用。 如上所述,从安全性和应用设计的角度来看,不可能安全地使用读写文件,因此应该避免使用