推 LiloHuang: 恐怕得直接用 ctypes 或者 pywin32 呼叫 CreateFileW 08/12 20:45
→ LiloHuang: 搭配FILE_FLAG_WRITE_THROUGH, FILE_FLAG_NO_BUFFERING 08/12 20:46
→ LiloHuang: 我剛瞧了一下 Python 2.7 的源碼,並無以上的實作釋出 08/12 20:47
推 LiloHuang: 剛剛看到有一條路可以用...應該算是隱藏的後門 XD 08/12 20:55
→ LiloHuang: from _multiprocessing import win32 之後 08/12 20:55
→ LiloHuang: 就可以用 win32.CreateFile(...) 的 API 來設定 flag 08/12 20:56
→ LiloHuang: 只不過上面兩個常數沒有被寫進去,得查 header file 囉 08/12 21:03
→ dctzeng: 太感謝 嗚嗚 ~~ 08/12 21:19
→ dctzeng: 可以請教一下 中文路徑編碼 在 win32.CreateFile 失敗? 08/12 21:54
推 LiloHuang: 真尷尬,剛剛去看了一下 DLLs\_multiprocessing.pyd 08/12 22:07
推 LiloHuang: 該檔案的 Win32 PE Import Table 是寫 CreateFileA 08/12 22:09
→ LiloHuang: 猜測 CPython 2.7 當初編譯時,沒有用 UNICODE 來編譯 08/12 22:10
→ LiloHuang: 只能請樓主用 ctypes.windll.kernel32.CreateFileW 囉 08/12 22:10
→ LiloHuang: 不然就只能用 win32.CreateFile(r'D:\中文字.txt', ... 08/12 22:23
→ LiloHuang: Non-UNICODE 版本加減用 XD 只是這樣不是很好就是 08/12 22:24
推 LiloHuang: 補充如果要自己重新編譯 Python Runtime 使其支援 XD 08/12 22:37
→ LiloHuang: 除了得選 UNICODE 模式,PyArg_ParseTuple 也得改一下 08/12 22:38
→ LiloHuang: 但是這不是一個很正常的方式,跟官方版本一致就好 08/12 22:40
→ dctzeng: 感謝樓上 該部會那篇是同行po的吧 XDDDD 08/13 23:11
→ dctzeng: 今天才搞dll來開file, 原來有更好的解法 08/13 23:12
→ dctzeng: python 有內建 fd.flush 跟os.fsync 我試只對write 有效 08/13 23:21
→ dctzeng: read 還是一直打中cache 我就改從做dll來解問題 08/13 23:23
推 LiloHuang: 基本上呢該篇文章就是我第一個回應提到的,使用pywin32 08/13 23:43
→ LiloHuang: 如果樓主願意安裝pywin32的話,那是一個很棒的選擇 :D 08/13 23:43
→ LiloHuang: 根據原始碼 file_flush 的實作,是使用 fflush 函式 08/13 23:46
→ LiloHuang: fflush 是標準 C runtime 提供的能力,而呼叫 fflush 08/13 23:46
→ LiloHuang: 並不會呼叫 Win32 API 的 FlushFileBuffers 08/13 23:47
→ LiloHuang: 樓主也可以用 windbg 下中斷點測試 :D 應該不會hit才是 08/13 23:48
→ LiloHuang: 畢竟 fflush 跟 FlushFileBuffers 使用的目的就不同 08/13 23:51
→ LiloHuang: 而在這個狀況的確得使用 FlushFileBuffers 再搭配 08/13 23:51
→ LiloHuang: 我先前的推文或該文章中所提及的那兩個 flag 才是正解 08/13 23:53
推 LiloHuang: 然而 os.fsync 狀況就不同了,在視窗平台上會用_commit 08/14 00:04
→ LiloHuang: _commit 會轉呼叫 FlushFileBuffers (可下斷點驗證) 08/14 00:04
→ LiloHuang: 根據以上資訊 os.fsync 應該要清緩衝,也許可以再試試 08/14 00:08
→ LiloHuang: 當然使用時,你的 fd 本身在建立時也得具備那兩個 flag 08/14 00:09
→ dctzeng: 樓上大大感謝 可以請教您怎麼找到實作原始碼? 08/14 22:42
→ LiloHuang: 上面那個連結我貼成 stackless 版,儘管內容幾乎一樣 08/14 23:05
→ LiloHuang: 至於怎麼樣找原始碼? 官網就有提供下載整包源碼啦 :D 08/14 23:06
→ LiloHuang: 要看特定版號就去官網首頁抓源碼,或在SVN找對應branch 08/14 23:11
→ dctzeng: 喔~~ 感恩 我初入門python 學習了 08/14 23:33