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

用代碼取得檔的創建時間,完成後為什麼檔不能釋放?

答題得分者是:andychang1690
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-01 17:45:29 IP:222.135.xxx.xxx 未訂閱
各位先輩,我的這個代碼執行後除非關閉程式,否則檔始終處於被獨佔打開的狀態,百思不得其解,不知道問題在那裏?我的代碼如下:  
  //自定義函數:編寫人jean
  AnsiString iFileTime(AnsiString iFilePath, int iOrder)//1=創建時間;2=修改時間;3=最後訪問時間
  {//取得檔的創建時間、修改時間和最後訪問時間:
    AnsiString iReturn;//返回值
    int hf=FileOpen(iFilePath.c_str(),fmOpenRead);
    FILETIME fct,fat,fwt;//CreationTime,LastAccessTime,LastWriteTime
    FILETIME lft;//本地時間
    TSystemTime st;
    ZeroMemory(&fct,sizeof(fct));//初始化
    ZeroMemory(&fat,sizeof(fat));
    ZeroMemory(&fwt,sizeof(fwt));
    ZeroMemory(&lft,sizeof(lft));
    GetFileTime((void *)hf,&fct,&fat,&fwt);//取檔時間        TDateTime dt;
      if(iOrder==1)
      {
        //創建時間
        FileTimeToLocalFileTime(&fct,&lft);//轉換為本地時間
        FileTimeToSystemTime(&lft,&st);//先轉換成系統時間再轉換成TDateTime類型
        dt=SystemTimeToDateTime(st);
        //ShowMessage("檔創建時間:" dt.DateTimeString());
        return dt.DateTimeString();//返回值
      }
      if(iOrder==3)
      {
        FileTimeToLocalFileTime(&fat,&lft);//訪問時間
        FileTimeToSystemTime(&lft,&st);
        dt=SystemTimeToDateTime(st);
        //ShowMessage("檔最後訪問時間:" dt.DateTimeString());
        return dt.DateTimeString();//返回值
      }
      if(iOrder==2)
      {
        FileTimeToLocalFileTime(&fwt,&lft);//修改時間
        FileTimeToSystemTime(&lft,&st);
        dt=SystemTimeToDateTime(st);
        //ShowMessage("檔最後修改時間:" dt.DateTimeString());
        return dt.DateTimeString();//返回值
        //FileClose(hf);
      }
    FileClose(hf);
  }
  bool IsFileInUse(String FileName)
  {//測試檔是否被以獨佔方式打開
    bool Result;
    HANDLE Handle = CreateFile(FileName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    Result = INVALID_HANDLE_VALUE == Handle;
      if(!Result)CloseHandle(Handle);
    return Result;
  }
void __fastcall TForm1::Button1Click(TObject *Sender)
{//1=創建時間;2=修改時間;3=最後訪問時間
  AnsiString iFile="C:\\SiSSetup.txt";
    if(IsFileInUse(iFile)==true)
      Edit1->Text="檔被以獨佔方式打開,不能取得正確的時間!";
    else
      Edit1->Text=iFileTime(iFile, 1);
}
 
發表人 - jean2004 於 2005/07/01 17:52:43
pwipwi
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-01 21:09:06 IP:219.84.xxx.xxx 未訂閱
你好: if(Result)CloseHandle(Handle);
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-02 17:05:07 IP:222.135.xxx.xxx 未訂閱
版主大人:你好! 恕我愚鈍,版主大人的代碼好像並沒有解決我的問題,使用後還是要關閉程式才能操作被測試的檔,不知道大人的這行代碼要如何使用才可以解決我的問題?
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-02 17:08:26 IP:222.135.xxx.xxx 未訂閱
另外,版主大人,我現在已經無法發表新主題了,說我有10個未結貼的文章,可是我現在無論如何也找不到另外的8篇未結貼的文章了,遇到這種情況我該如何處理?
andychang1690
資深會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-02 17:34:24 IP:221.169.xxx.xxx 未訂閱
jean2004:
一:請至
http://delphi.ktop.com.tw/pop_profile.asp?mode=display&id=37623
發表文章數:  37 觀看發表文章明細進入後是有十篇文章未結。
二:請注意你
AnsiString iFileTime(AnsiString iFilePath, int iOrder)//1=創建時間;2=修改時間;3=最後訪問時間
{
  int hf=FileOpen(iFilePath.c_str(),fmOpenRead); //開檔
  ... 
  if(iOrder==1)
  {
    ...
    return dt.DateTimeString();//返回值
    //符合上述條件返回並沒有關檔。
  }
  if(iOrder==2)
  {
    ...
    return dt.DateTimeString();//返回值
    //符合上述條件返回並沒有關檔。
  }
  if(iOrder==3)
  {
    ...
    return dt.DateTimeString();//返回值
    //符合上述條件返回並沒有關檔。
  }
  FileClose(hf);
  //不符合上述條件你才執行關檔。
  //但卻沒有返回值?
}
請參考!    
Andy Chang
------
Andy Chang
jean2004
初階會員


發表:69
回覆:80
積分:39
註冊:2004-12-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-02 18:37:59 IP:222.135.xxx.xxx 未訂閱
感謝兩位大蝦的回復,問題已解決,原來我應該在返回之前就執行FileClose(hf);,而不是在返回之後關閉檔,感謝兩位大蝦的回復,謝謝!!!
系統時間:2024-06-02 0:57:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!