線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6847
推到 Plurk!
推到 Facebook!

請問如何取得檔案之建立時間!!

尚未結案
reywwu
一般會員


發表:1
回覆:2
積分:0
註冊:2004-09-21

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-24 13:59:11 IP:61.222.xxx.xxx 未訂閱
請問如何利用BCB來取得檔案的建立時間。如在WINDOWS中選取檔案內容可看到的檔案建立時間,那是否可以利用程式來批次取得大量檔案的之檔名及其所對應的時間資料呢? 欲建立之八料格式如: 檔名 建立時間 ------- ----------------------------- XXX.raw 2004年8月31日, 上午 10:11:06 ... ... ... ... ... ... 煩請各位大哥不吝指教!!謝謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-24 16:33:57 IP:210.68.xxx.xxx 未訂閱
您好: 可以參考下面連結 http://delphi.ktop.com.tw/topic.php?topic_id=35878 順心
reywwu
一般會員


發表:1
回覆:2
積分:0
註冊:2004-09-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-24 17:07:19 IP:61.222.xxx.xxx 未訂閱
taishyang 大哥你好: 我有參考gemi0305所發表的內容下 --------------------------------------- 這裡有個小範例, 改寫自C Builder & Windows API 範例辭典 文魁出版社~ 在form上加一個button、一個opendialog,一個memo void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString FName; if(OpenDialog1->Execute()) FName=OpenDialog1->FileName; HANDLE fo = ::CreateFile(FName.c_str(), GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); BY_HANDLE_FILE_INFORMATION fd; if(::GetFileInformationByHandle(fo, &fd)) { Memo1->Lines->Add("建立時間(L):" AnsiString((int)fd.ftCreationTime.dwLowDateTime)); Memo1->Lines->Add("建立時間(H):" AnsiString((int)fd.ftCreationTime.dwHighDateTime)); Memo1->Lines->Add("最後存取時間(L):" AnsiString((int)fd.ftLastAccessTime.dwLowDateTime)); Memo1->Lines->Add("最後存取時間(H):" AnsiString((int)fd.ftLastAccessTime.dwHighDateTime)); Memo1->Lines->Add("最後寫入時間(L):" AnsiString((int)fd.ftLastWriteTime.dwLowDateTime)); Memo1->Lines->Add("最後寫入時間(H):" AnsiString((int)fd.ftLastWriteTime.dwHighDateTime)); Memo1->Lines->Add("檔案大小(H):" AnsiString((int)fd.nFileSizeHigh)); Memo1->Lines->Add("檔案大小(L):" AnsiString((int)fd.nFileSizeLow)); } } ------------------------------------------------------------- 但我依上述所取得的檔案資料如下 =============================== 建立時間(L):-200325678 建立時間(H):29661742 最後存取時間(L):-570470000 最後存取時間(H):29663749 最後寫入時間(L):-165013178 最後寫入時間(H):29661742 檔案大小(H):0 檔案大小(L):9437238 =============================== 不好意思,我並不是很了解程式內容,所以不知道該怎麼去修改使輸出格式能轉換成(年、月、日),(時、分、秒) 還有這個程式似乎不能讀取*.raw的檔案,不知是否有解決的方法呢?? 還得麻煩各位大哥了~謝謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-24 18:00:19 IP:210.68.xxx.xxx 未訂閱
您好: 試試下面的程式碼
 AnsiString FileTime = FormatDateTime("dddddd ampm hh:nn:ss",
                                       FileDateToDateTime(FileAge("1.raw")));
  ShowMessage(FileTime); 
順心
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-24 22:20:18 IP:211.76.xxx.xxx 未訂閱
reywwu你好:    taishyang版主的做法可以得到最後寫入的時間。但如果你需要取得建立時間,或存取時間的話,可以參考下面的碼…是我自已包裝的程式庫的一部分。     
 
class FileTimeX{
        protected:
                __int64 Date;
        protected:
                void Copy(const FileTimeX& rhs){Date = rhs.Date;}
        public:
                FileTimeX(){}
                FileTimeX(__int64 rhs){Date = rhs;}
                FileTimeX(const FILETIME& rhs){Date = *(__int64*)&rhs;}
                FileTimeX(const FileTimeX& rhs){Copy(rhs);}
                FileTimeX& operator=(const FileTimeX& rhs){Copy(rhs);return *this;}
        public:
                bool operator>(const FileTimeX& rhs) const         //first is later
                        {return CompareFileTime((FILETIME*)&Date,(FILETIME*)&rhs.Date) == 1;}
                bool operator<(const FileTimeX& rhs) const        // last is later
                        {return CompareFileTime((FILETIME*)&Date,(FILETIME*)&rhs.Date) == -1;}
                bool operator==(const FileTimeX& rhs) const
                        {return CompareFileTime((FILETIME*)&Date,(FILETIME*)&rhs.Date) == 0;}                    operator FILETIME() const {return *(FILETIME*)&Date;}
                operator TDateTime() const
                {
                    LongRec Result;
                    TFileTime LocalFileTime;
                    FileTimeToLocalFileTime((const _FILETIME*)&Date,&LocalFileTime);
                    FileTimeToDosDateTime(&LocalFileTime,&(Result.Hi),&(Result.Lo));
                    return FileDateToDateTime(*(int*)&Result);
                }            };    //---------------------------------------------------------------------------
bool FileGetDate(const AnsiString& FileName,
        FileTimeX* CreateTime,
        FileTimeX* LastAccessTime,
        FileTimeX* LastWriteTime)
{
        bool Result;
        THandle FileHandle;
        if((FileHandle = FileOpen(FileName, fmOpenRead)) == THandle(-1))
                return false;
        Result = GetFileTime((void*)FileHandle,
                (FILETIME*)CreateTime,
                (FILETIME*)LastAccessTime,
                (FILETIME*)LastWriteTime);
        FileClose(FileHandle);
        return Result;
}    //---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
FileTimeX CreateTimeOfFile;
// 用法:FileGetDate(FileName,CreateTime,LastAccessTime,LastWriteTime)
if(FileGetDate("c:\\temp.txt",&CreateTimeOfFile,0,0)) //如果不需要知道其他的時間,就傳0
    {
    Caption = TDateTime(CreateTimeOfFile).TimeString(); //時間
    Caption = TDateTime(CreateTimeOfFile).DateString(); //日期
    Caption = FormatDateTime("dddddd ampm hh:nn:ss",CreateTimeOfFile); //格式化
    }
}
//---------------------------------------------------------------------------    
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-25 00:21:38 IP:221.169.xxx.xxx 未訂閱
reywwu:幾位大大提供精彩的說明,我也來插花一下。
我喜歡使用WIN32_FIND_DATA結構,定義如下:
typedef struct _WIN32_FIND_DATA {
  DWORD dwFileAttributes;          // 文件屬性
  FILETIME ftCreationTime;         // 文件創建時間
  FILETIME ftLastAccessTime;       // 文件最後一次訪問時間
  FILETIME ftLastWriteTime;        // 文件最後一次修改時間
  DWORD nFileSizeHigh;             // 文件長度高32位
  DWORD nFileSizeLow;              // 文件長度低32位
  DWORD dwReserved0;               // 系統保留
  DWORD dwReserved1;               // 系統保留
  TCHAR cFileName[ MAX_PATH ];     // 長檔案名
  TCHAR cAlternateFileName[ 14 ];  // 8.3格式檔案名(DOS)
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
你看幾乎文件格式都在裡面。我依你的需要舉一例子:
#include  // 使用EncodeDateTime函數需要
// 顯示所有條件於Memo1上。
  FindFilesInDirectory (ExtractFilePath(ParamStr(0)),"*.exe"); //目錄,檔案
void __fastcall TForm1::FindFilesInDirectory (AnsiString &directory,AnsiString fileseek)
{
  SYSTEMTIME ft;
  TDateTime dt;
  WIN32_FIND_DATA filedata ;  // Structure for file data
  HANDLE filehandle ;         // Handle for searching
  // 找尋檔案於指定目錄
  filehandle = FindFirstFile ((directory   fileseek).c_str (), &filedata) ;
  if (filehandle != INVALID_HANDLE_VALUE)  {
    do  {
      // Display the file name.
      Memo1->Lines->Add(directory   filedata.cFileName);
      // filedata.ftCreationTime為文件創建時間,你可以更換
      FileTimeToSystemTime(&filedata.ftCreationTime,&ft); // 將文件創建時間轉換
      dt=EncodeDateTime(ft.wYear,ft.wMonth,ft.wDay,ft.wHour,ft.wMinute,ft.wSecond,(Word) 0);
      Memo1->Lines->Add(directory   filedata.cFileName " " dt.FormatString("yyyy/mm/dd hh:nn:ss"));
      // Display the file size.
//      if (filedata.nFileSizeHigh == 0)  { 
//        Memo1->Lines->Add (String ((int) ((filedata.nFileSizeLow   1023)/1024))   " K") ;
//      }
//      else  {
//        // If nFileSizeHigh is non-zero then this is a **HUGE** file.
//        double filesize = (MAXDWORD * filedata.nFileSizeHigh)   filedata.nFileSizeLow ;
//        Memo1->Lines->Add (String (filesize / 1024.0)   " K") ;
//      }
//      // Display the MS-DOS name for the file.
//      Memo1->Lines->Add>Add (String (filedata.cAlternateFileName)) ;
//      Application->ProcessMessages () ;
    } while (FindNextFile (filehandle, &filedata)) ;
    FindClose (filehandle) ;
  }      // 繼續尋找當前目錄下的子目錄
  String dir = directory   "*.*" ;
  filehandle = FindFirstFile ((directory   "*.*").c_str (), &filedata) ;
  if (filehandle != INVALID_HANDLE_VALUE)  {
    do  {
      if ((filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0
           && String (filedata.cFileName) != "."
           && String (filedata.cFileName) != "..")   {
        // Recursive call here
        FindFilesInDirectory (directory   filedata.cFileName   "\\") ;
      }
    } while (FindNextFile (filehandle, &filedata)) ;
    FindClose (filehandle) ;
  }      Application->ProcessMessages () ;
  return ;
}    以上請參考!    
Andy Chang
------
Andy Chang
reywwu
一般會員


發表:1
回覆:2
積分:0
註冊:2004-09-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-27 12:10:40 IP:61.222.xxx.xxx 未訂閱
感謝taishyang、pwipwi及andychang1690三位大大的解答~ 三位大大所提供的方法已經解決了小弟的問題了 再一感謝囉^_^
系統時間:2024-06-30 14:20:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!