作者lazybones (懶)
看板C_and_CPP
標題[問題] 替檔案設定時間
時間Wed Nov 18 11:06:17 2009
我嘗試幫複製出來的檔案設定時間
但是只要碰到有"唯讀"屬性的檔案 複製出來的檔案時間設定就會不對
時間不會是我要的 而是被複製出來的時間
下面是code 請問可能是哪邊出錯?@@
感謝!
HANDLE hFileOld, hFileNew;
FILETIME OCreateTime, OLastAccessTime, OLastWriteTime;
const FILETIME *NCreationTime, *NLastAccessTime, *NLastWriteTime;
hFileOld = CreateFile(cOldPathName, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hFileNew = CreateFile(cNewPathName, GENERIC_READ|GENERIC_WRITE, 0,
NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
//設定時間
GetFileTime(hFileOld, &OCreateTime, &OLastAccessTime, &OLastWriteTime);
NCreationTime = &OCreateTime;
NLastAccessTime = &OLastAccessTime;
NLastWriteTime = &OLastWriteTime;
SetFileTime(hFileNew, NCreationTime, NLastAccessTime,NLastWriteTime);
CloseHandle(hFileNew);
CloseHandle(hFileOld);
--
★
╔╮ ╭═╦╮╭═╦╗╮ ╮╔══╮╭═╦╮╮ ╔╮╔══╮╭══╮
╠╣ ╠═╬╣╭╬╩╯╰╦╦╯╠═╦╮║ ╠╣║║╠╣╠╣ ╰═╦╮
╠╣ ╭║ ╠╣║╰╔╗ ╠╣ ║ ╠╣║ ╠╣║╰╠╣║╰╔╗║ ╠╣
╰╩═╯╰ ╰╝╚═╩╯ ╰╝ ╚═╩╯╰═╩╯╰ ╰╝╚═╩╯╰═╩╯
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.211.0.80
1F:推 ledia:SetFileTime 得要有 FILE_WRITE_ATTRIBUTES 11/18 11:18
2F:→ ledia:唯讀檔案應該是沒辦法改的 11/18 11:19
3F:→ lazybones:謝謝!那唯讀檔案有function能處理嗎? 11/18 11:25
4F:推 ledia:用 SetFileAttributes 拿掉唯讀權限? 如果不能拿就沒法了 11/18 11:35
5F:推 VictorTom:這應該跟OS檔案系統有關了吧?? 在Linux下沒有w權限的檔 11/18 11:54
6F:→ VictorTom:檔案應該也不能touch吧....?_? 11/18 11:54
謝謝!我OS是MS XP
然後複製檔案部分是自己用fopen()開2個 分別讀跟寫
所以新檔案在設定屬性之前 應該也沒有"唯讀"屬性
不過就算先設時間 再給屬性 時間還是一樣不對 Orz
※ 編輯: lazybones 來自: 218.211.0.80 (11/18 13:03)
7F:推 VictorTom:Windows下有Created時間與Modified時間, 一般我們直接 11/18 13:14
8F:→ VictorTom:Copy file, 解壓縮, 安裝檔案等時, Created的時間都是當 11/18 13:15
9F:→ VictorTom:下操作的時間, Modifed才會是原來檔案最後修改的時間; 11/18 13:16
10F:→ VictorTom:小弟覺得這就是OS檔案系統的行為, 在這邊你去搞唯讀什麼 11/18 13:16
11F:→ VictorTom:的應該沒什麼用; 不曉得為什麼您要care這個時間的問題. 11/18 13:17
12F:→ VictorTom:PS. 小弟也是XP, 就算不是唯讀, 複製時Created時間都是 11/18 13:17
13F:→ VictorTom:當下的@_@" 11/18 13:17
14F:→ VictorTom:PS2.唯讀檔案, 複製完Modified時間也不會變, 補充一下:) 11/18 13:18
15F:→ VictorTom:如果WindowsAPI沒有提供修改的方式, 而您又真的想弄到一 11/18 13:19
16F:→ VictorTom:模一樣, 感覺就要跨過OS檔案系統才辦得到, 以上純猜測XD 11/18 13:19
17F:→ lazybones:謝謝!我問題就出在Modified時間(LastWriteTime?)不對 11/18 14:06
18F:→ lazybones:為啥要care...因為是作業要求 哈!感謝l大 V大 11/18 14:07
唔...搞定了= =
我後來在做複製之前先做以下處理
dwAttributes = GetFileAttributes(cOldPathName); //取得cOldPathName屬性
SetFileAttributes(cOldPathName, 0); //把cOldPathName屬性設成一般
做完複製之後
SetFileAttributes(cOldPathName, dwAttributes); //設成原來屬性
這樣就沒有我之前的問題了 囧>
※ 編輯: lazybones 來自: 218.211.0.80 (11/18 14:59)
19F:推 ledia:沒錯~ 先去掉唯讀, 改好時間之後再加回來, 不過這要求怪怪XD 11/18 16:30