在windows下用python操作文件属性的完整例子

Windows环境下Python操作文件属性实战
本文提供了一个在Windows上使用Python(3.10.6)操作文件属性的完整示例,涉及到os, ctypes, win32api, win32con, sys等多个API模块。在Windows系统中,这些方法用于读取和设置文件属性,对于Unix系统可能不适用。案例已成功调试,适用于需要此类功能的开发者。" 102997855,7875518,使用位运算解决A+B问题,"['算法', '位操作', '计算', '整数']

这个例子中涉及了windows的多个api模块,如os,ctypes,win32api,win32con,sys等。

因为有些文件属性的方法在windows和unix上不能通用,这里面涉及的主要是读取和设置文件属性的主要方法。于windows上 python3.10.6下调试通过。

希望能帮到需要的C友们!

import os
import ctypes
import win32api
import win32con
import sys
#文件路径
print('==>指定文件路径:')
path =r'e:\my_project\pythons\pycharm\1.20os文件目录方法\1.20.3chflags\file_test.txt'
'''注意:此处path=r 中用"r"表示后面字符串中的\符号不做转义符处理,而是视为"\"字符输出。'''

print('\tpath=',path)  #目录中没有此文件,执行此语句是ok的
##=======================================================

print('==>检查是否存在指定的文件:')
if os.path.exists(path):
    print('\t存在')
else:
    print('\t不存在,创建之')
    ##=======================================================
    file=open(path,'w+')
    file.write('test1122')
    file.close()
    ##=======================================================
    ##以上打开文件写文件的代码可以用以下部分替换
    # with open(path,'w+') as file:
    #     file.write('test1122')
    ##=======================================================


print('==>获取当前文件属性:')
attrs=ctypes.windll.kernel32.GetFileAttributesW(path) #GetFileAttributesW() 函数接受的文件路径参数是宽字符类型,因此在传递文件路径时,需要使用 W 结尾的函数,并确保文件路径是 Unicode 字符串
if attrs != -1:
    print('\t获取成功')
    print('\t成功的文件属性值为:attrs=',attrs)
    attrs_hex = hex(attrs)
    print('\t成功的(16进制)文件属性值为:attrs_hex=',attrs_hex)
    attrs_bin=bin(attrs)
    print('\t成功的(2进制)文件属性值为:attrs_bin=', attrs_bin)


else:
    print('\t获取失败')
    error_code = ctypes.windll.kernel32.GetLastError()
    print('\t对应的错误码为: error_code=',error_code)
    print('\t错误的文件属性值为: attrs=',attrs)
    attrs_hex = hex(attrs)
    print('\t错误的(16进制)文件属性值为:attrs_hex=',attrs_hex)
    attrs_bin=bin(attrs)
    print('\t错误的(2进制)文件属性值为:attrs_bin=', attrs_bin)
    sys.exit()

##=======================================================

print('==>判断是否有只读属性:')
#is_readonly = attrs & ctypes.windll.kernel32.FILE_ATTRIBUTE_READONLY
is_readonly = attrs & win32con.FILE_ATTRIBUTE_READONLY
if is_readonly:
    print('\t是 is_readonly=', is_readonly)
else:
    print('\t否 is_readonly=', is_readonly)

print('==>判断是否有隐藏属性:')
#is_hidden = attrs & ctypes.windll.kernel32.FILE_ATTRIBUTE_HIDDEN
is_hidden = attrs & win32con.FILE_ATTRIBUTE_HIDDEN
if is_hidden:
    print('\t是 is_hidden=', is_hidden)
else:
    print('\t否 is_hidden=', is_hidden)
##=======================================================
if is_hidden | is_readonly:
    print('==>去除只读和隐藏属性')
    result = win32api.SetFileAttributes(path, win32con.FILE_ATTRIBUTE_NORMAL)
    if result != -1:
        print('\t成功 result=',result)
    else:
        print('\t失败 result=', result)
        sys.exit()
##=======================================================

print('==>生成新的文件属性变量值attrs_new(只读+隐藏):')
#attrs_new   = (attrs) |  (0x01)
attrs_new   = (attrs) | win32con.FILE_ATTRIBUTE_READONLY | win32con.FILE_ATTRIBUTE_HIDDEN
print('\tattrs_new=', attrs_new)
attrs_new_hex = hex(attrs_new)
print('\tattrs_new_hex=', attrs_new_hex)
attrs_new_bin = bin(attrs_new)
print('\tattrs_new_bin=', attrs_new_bin)
##=======================================================

print('==>对文件设置新的文件属性:')
result=ctypes.windll.kernel32.SetFileAttributesW(path,attrs_new)
if result != 0:
    print('\t设置新属性成功,返回值为:result=', result)
else:
    error_code = ctypes.windll.kernel32.GetLastError()
    print('\t设置新属性失败,返回值为:result=', result)
    print("\tError code=", error_code)


##=======================================================

print('==>检查是否设置了隐藏属性')
if ctypes.windll.kernel32.GetFileAttributesW(path) & win32con.FILE_ATTRIBUTE_READONLY:
    print('\tThe file is read-only.')
else:
    print('\tThe file is not read-only')
if ctypes.windll.kernel32.GetFileAttributesW(path) & win32con.FILE_ATTRIBUTE_HIDDEN:
    print('\tThe file is hidden.')
else:
    print('\tThe file is not hidden.')

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值