在Python中强制读取可移动媒体文件/扇区以返回新数据(未从先前读取中缓存)?

问题描述 投票:0回答:1

我构建了一个 USB 数据记录棒,插入文件下载时会显示为 USB 大容量存储设备。文件是离线记录的,但当信号量较小时,棒可以返回有限的“实时”数据(设备时钟、电池电量、瞬时传感器值)(<512 bytes, 1 disk sector) special file on the device is read - basically like a UNIX device file.

读取和使用/显示记录器数据的应用程序是用Python编写的。

我以为自己是个聪明人,直到我实际从该文件中读取实时数据。事实证明,在 Windows 下(到目前为止在 XP 和 Win7 中进行了测试),只有应用程序的第一次读取实际上从设备读取 - 尝试重新读取文件(扇区)会返回初始读取中陈旧的缓存数据,甚至 10初始读取后 + 分钟,即使文件已关闭并重新打开,或者扇区已写入然后重新读取。通过 mmap() 访问文件数据也不会导致新的读取。后续的读取请求根本不会到达设备。我猜 Windows“知道”它没有修改文件本身,因此文件内容不可能改变。

是否有任何明智的方法来强制后续读取(最好通过“标准”Python 文件 I/O 调用)实际从设备返回新读取而不是缓存数据?

需要明确的是,我特指的是阻止读取缓存,而不是在写入后同步磁盘内容。

是否存在可以从 Python 中访问的类似内容?

python file caching disk
1个回答
1
投票

使操作系统磁盘读取缓存无效

使用 Python 的 win32 扩展应该允许您直接访问 CreateFile 调用来打开文件。您也许可以用它来读取您的文件。

这里是 Win32 扩展

import win32file, win32con, win32api

fn1="I:\x.dat"
f1 = win32file.CreateFile( fn1, win32con.GENERIC_READ, win32con.FILE_SHARE_READ, None, win32con.OPEN_EXISTING, win32con.FILE_FLAG_NO_BUFFERING, 0)
spc, bps, fc, tc  = win32file.GetDiskFreeSpace( "i:\\" ) 
bpc = spc * bps  
for i in xrange(1, 1000):     
    hr, r1 = win32file.ReadFile( f1, bpc )
    win32file.SetFilePointer(f1, 0, win32file.FILE_BEGIN)
    win32api.CloseHandle(f1)
© www.soinside.com 2019 - 2024. All rights reserved.