Python跨平台隐藏文件

15
在*nix中,我可以简单地在文件名前面加一个.来使其“隐藏”。在Windows中也有使文件隐藏的方法。
在Python中是否有一种跨平台的方法可以使文件隐藏?
当前状态:
def write_hidden(file_name, data):
    file_name = '.' + file_name
    with open(file_name_, 'w') as f:
        f.write(data)

但是正如我所说,这仅适用于*nix系统。


3
没有一种跨平台的方法可以创建隐藏文件,因为不同的操作系统有完全不同的实现方式。Windows版本基本上需要使用chattr()调用,而UNIX版本则修改文件名... 如何才能创建一个合理地同时实现这两个过程的单一抽象呢? - Charles Duffy
3
如果你的问题是如何使用Python在Windows上创建隐藏文件,那么你有更好的机会得到答案。你不可能找到一个能够同时完成这两个功能的抽象方法。 - Charles Duffy
这与Python无关,它实际上是一个操作系统层面的问题。在Python中可行的解决方案也适用于Perl、Ruby、C等语言。 - Martijn Pieters
1个回答

11

你可以像这样做:

import os
import ctypes

FILE_ATTRIBUTE_HIDDEN = 0x02

def write_hidden(file_name, data):
    """
    Cross platform hidden file writer.
    """
    # For *nix add a '.' prefix.
    prefix = '.' if os.name != 'nt' else ''
    file_name = prefix + file_name

    # Write file.
    with open(file_name, 'w') as f:
        f.write(data)

    # For windows set file attribute.
    if os.name == 'nt':
        ret = ctypes.windll.kernel32.SetFileAttributesW(file_name,
                                                        FILE_ATTRIBUTE_HIDDEN)
        if not ret: # There was an error.
            raise ctypes.WinError()

这还没有经过测试,但应该可以正常工作。

此外,您可能希望查看以下其他问题,这些问题帮助我实现了这个:


*nix 部分应该检查文件名是否已经以 '.' 开头。 - stark
1
避免使用 ctypes.windll。它会缓存函数指针,而其他库可能定义了不兼容的原型(即 restypeargtypeserrcheck)。此外,为了可靠性,您需要使用线程本地捕获的最后错误值。另外,您正在破坏现有文件属性。以下是考虑到这些观察结果的示例代码: - Eryk Sun
1
kernel32 = ctypes.WinDLL('kernel32', use_last_error=True); INVALID_FILE_ATTRIBUTES = -1; FILE_ATTRIBUTE_HIDDEN = 2; attrs = kernel32.GetFileAttributesW(filename) if attrs == -1: raise ctypes.WinError(ctypes.get_last_error()) attrs |= FILE_ATTRIBUTE_HIDDEN if not kernel32.SetFileAttributesW(filename, attrs): raise ctypes.WinError(ctypes.get_last_error())。 - Eryk Sun

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