Re: 檔案最後修改日期 - 感恩啦~[:`(] 實在是太感動了非常感謝你撥空回覆我在其他論壇也有詢問相同的問題希望能讓其他人也了解一下相關資料可否直接在其他論壇上留下這裡的網址怕會影響貴網站頻寬[:D] Phorum,論壇大師,forum,forums,Re: 檔案最後修改日期,感恩啦~[:`(] 實在是太感動了非常感謝你撥空回覆我在其他論壇也有詢問相同的問題希望能讓其他人也了解一下相關資料可否直接在其他論壇上留下這裡的網址怕會影響貴網站頻寬[:D]
網路技術
Re: 檔案最後修改日期

文章發起人:aqr199   開始時間:週四,2008 六月 12 上午 11:50   回應數:6

第 1 頁/共 1 頁,[共 7 篇]
  2008 六月 12, 上午 11:50
aqr199 不在線上。最近上線時間:2011/8/12 下午 10:17:37 aqr199

檔案最後修改日期

想問問題, 又找不到符合的分類, 看起來這個分類比較相近
如有不妥, 煩請刪除

最近在處理ftp檔案同步的問題
因為先前都是用Dreamweaver由電腦工程師做檔案同步
現在想要使用排程在晚上自動執行

找到了很多軟體, 都不太滿意
而且設定很複雜, 大部份都不支援指令型態

於是就自己寫了一個同步的vbs
步驟如下
1. 連上ftp取回檔案清單,關鍵指令(dir -l list.txt)
2. 由清單內容(list.txt)比對現有的檔案, 並產生下載清單(get.conf)
檔案不存在 -> 下載
檔案最後修改日期不對 -> 下載
檔案大小不對 -> 下載
3. 下載資料, 關鍵指令(ftp -s:get.conf)
get.conf內容示意如下
open ftp.xxx.com
isID
isPWD
lcd C:\
cd /images
binary
get 001.jpg
get 002.jpg
bye

※問題來了:下載的檔案最後修改日期變了?!

於是我做了一些檢查
1. Dreamweaver同步下來的檔案:建立日期及修改日期沒變
2. 用windows內建的ftp下載的檔案:建立日期及修改日期變為下載日期
3. 使用同步軟體(FTPSync)測試::建立日期變為下載日期, 修改日期沒變
http://www.fileware.com/products.htm
4. 使用wget下載:
如果透過ftp下載, 建立日期及修改日期變為下載日期
如果透過http下載, 建立日期變為下載日期, 修改日期沒變
5. 使用flashget下載:建立日期及修改日期沒變


Q. 為什麼都是下載檔案, 修改日期有些會被改變, 有些不會呢??

 

IP 位址: 已紀錄
  2008 六月 13, 上午 11:40
ricado 不在線上。最近上線時間:2021/9/19 下午 04:09:22 ricado


Re: 檔案最後修改日期

ftp 的規範並沒有定義保留時間這一部分。而相對於目的地的系統,當然是以檔案複製完成的時間為建立時間。

所以一般我們在設計軟體的時候,首先在讀取檔案的時候先紀錄檔案在原始位置的時間,等傳送完成後,再修改其時間,以下是一段 C++ 的例子:

 // 取得檔案資訊之後,開始下載
   if (!DownloadFile(localFileArray[0].m_szFullName, strLocalName, bResume, localFileArray[0].m_size, localFileArray[0].m_mtime))
   {
    break;
   }

//下載函式
BOOL CDownloadThread::DownloadFile(LPCTSTR lpszRemoteFile, LPCTSTR lpszLocalFile, BOOL bResume, __int64 dwLength, CTime &lastModificationTime)
{
 
//........  
//略...
//......

  if (m_bPreserveRemoteTimeStamp) //判斷是否要保留來源的時間
 {
  try
  {
   CFileStatus status;

   status.m_attribute = 0x00;
   status.m_mtime = lastModificationTime;
   status.m_ctime = lastModificationTime;
   status.m_atime = lastModificationTime;
   CFile::SetStatus(lpszLocalFile, status);
  }
  // just ignore any errors
  catch (CFileException *e)
  {  
   e->Delete();
   //略...
  }
  catch (...)
  {
    //略...
  }
 }
 return TRUE;
}

以 RunFTP 為例,使用者就可以自己決定傳遞後動作與時間戳記:

IP 位址: 已紀錄
  2008 六月 13, 下午 2:23
aqr199 不在線上。最近上線時間:2011/8/12 下午 10:17:37 aqr199

Re: 檔案最後修改日期
感謝你的說明眨眼睛

原來是下載後再修改檔案的日期

我本來以為是對於ftp規範實做的不同

再請教一個問題

如果我要做一個修改檔案日期的功能
以上範例是C++的方法,

如果改用VB需要用到什麼元件或API嗎??
IP 位址: 已紀錄
  2008 六月 13, 下午 3:36
ricado 不在線上。最近上線時間:2021/9/19 下午 04:09:22 ricado


Re: 檔案最後修改日期

※以下為範例程式,請自行服用,風險自負...戴太陽眼鏡

'Win API

GetFileTime
SetFileTime

'API宣告
Private Declare Function GetFileTime Lib "kernel32" Alias "GetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long

Private Declare Function SetFileTime Lib "kernel32" Alias "SetFileTime" (ByVal hFile As Long, lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long


'函數實作範例:


' Return True if there is an error.
Private Function GetFileTimes(ByVal file_name As String, _
    ByRef creation_date As Date, ByRef access_date As Date, _
    ByRef modified_date As Date, ByVal local_time As _
    Boolean) As Boolean

Dim file_handle As Long
Dim creation_filetime As FILETIME
Dim access_filetime As FILETIME
Dim modified_filetime As FILETIME
Dim file_time As FILETIME

    ' Assume something will fail.
    GetFileTimes = True

    ' Open the file.
    file_handle = CreateFile(file_name, GENERIC_READ, _
        FILE_SHARE_READ Or FILE_SHARE_WRITE, _
        0&, OPEN_EXISTING, 0&, 0&)
    If file_handle = 0 Then Exit Function

    ' Get the times.
    If GetFileTime(file_handle, creation_filetime, _
        access_filetime, modified_filetime) = 0 Then
        CloseHandle file_handle
        Exit Function
    End If

    ' Close the file.
    If CloseHandle(file_handle) = 0 Then Exit Function

    ' See if we should convert to the local
    ' file system time.

    If local_time Then
        ' Convert to local file system time.
        FileTimeToLocalFileTime creation_filetime, file_time
        creation_filetime = file_time

        FileTimeToLocalFileTime access_filetime, file_time
        access_filetime = file_time

        FileTimeToLocalFileTime modified_filetime, file_time
        modified_filetime = file_time
    End If

    ' Convert into dates.
    creation_date = FileTimeToDate(creation_filetime)
    access_date = FileTimeToDate(access_filetime)
    modified_date = FileTimeToDate(modified_filetime)

    GetFileTimes = False
End Function


' Return True if there is an error.
Private Function SetFileTimes(ByVal file_name As String, _
    ByVal creation_date As Date, ByVal access_date As Date, _
    ByVal modified_date As Date, ByVal local_times As _
    Boolean) As Boolean
Dim file_handle As Long
Dim creation_filetime As FILETIME
Dim access_filetime As FILETIME
Dim modified_filetime As FILETIME
Dim file_time As FILETIME

    ' Assume something will fail.
    SetFileTimes = True

    ' Convert the dates into FILETIMEs.
    creation_filetime = DateToFileTime(creation_date)
    access_filetime = DateToFileTime(access_date)
    modified_filetime = DateToFileTime(modified_date)

    ' Convert the file times into system file times.
    If local_times Then
        LocalFileTimeToFileTime creation_filetime, file_time
        creation_filetime = file_time

        LocalFileTimeToFileTime access_filetime, file_time
        access_filetime = file_time

        LocalFileTimeToFileTime modified_filetime, file_time
        modified_filetime = file_time
    End If

    ' Open the file.
    file_handle = CreateFile(file_name, GENERIC_READ, _
        FILE_SHARE_READ Or FILE_SHARE_WRITE, _
        0&, OPEN_EXISTING, 0&, 0&)
    If file_handle = 0 Then Exit Function

'creation_date = FileTimeToDate(creation_filetime)

    ' Set the times.
    If SetFileTime(file_handle, creation_filetime, _
        access_filetime, modified_filetime) = 0 Then
        CloseHandle file_handle
        Exit Function
    End If

    ' Close the file.
    If CloseHandle(file_handle) = 0 Then Exit Function

    SetFileTimes = False
End Function


IP 位址: 已紀錄
  2008 六月 13, 下午 4:20
aqr199 不在線上。最近上線時間:2011/8/12 下午 10:17:37 aqr199

Re: 檔案最後修改日期

感恩啦~嚎啕大哭 實在是太感動了

非常感謝你撥空回覆

我在其他論壇也有詢問相同的問題
希望能讓其他人也了解一下相關資料

可否直接在其他論壇上留下這裡的網址
怕會影響貴網站頻寬開懷大笑

IP 位址: 已紀錄
  2008 六月 13, 下午 4:49
ricado 不在線上。最近上線時間:2021/9/19 下午 04:09:22 ricado


Re: 檔案最後修改日期

沒問題啦,我們是自己的主機和專線,頂多網站慢一點而已 戴太陽眼鏡

IP 位址: 已紀錄
  2008 六月 13, 下午 5:21
aqr199 不在線上。最近上線時間:2011/8/12 下午 10:17:37 aqr199

Re: 檔案最後修改日期

感謝 開懷大笑

IP 位址: 已紀錄
第 1 頁/共 1 頁,[共 7 篇]
前往: