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

目錄下的檔案名稱改成短檔名

尚未結案
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-26 23:27:10 IP:59.104.xxx.xxx 未訂閱
以下的程式碼是在站上蒐集的,不過現在要找好像找不到,對提供者先至上歉意
 
void TForm1::DirFiles(AnsiString RootDir, bool chkSubDir, bool incPath)
{
    chdir(RootDir.c_str());  // 切換到指定目錄去        TSearchRec Sr;  // 設 Sr 為存放檔案資訊的結構變數
    AnsiString FileName;  // 設定檔案名稱之用的暫存變數
    char dos_name[256];        int done = FindFirst("*.*", faDirectory | faAnyFile, Sr);
    while (done == 0)
    {
        if (!(Sr.Attr & faDirectory))   // 如果是檔案
        {
            if (incPath) // 如果檔名要包含路徑資料在內
            {
                char curdir[MAXPATH 1];
                GetCurrentDirectory(MAXPATH, curdir);  // 取得現行目錄名稱
                FileName = AnsiString(curdir)   "\\"   Sr.Name;  // 設定含路徑的檔名
            }
            else
            {
                FileName = Sr.Name;  // 設定不含路徑的檔名
            }                //這裡我先取得短檔名在dos_name
            GetShortPathName(FileName.c_str(),dos_name,1024);
            //使用RenameFile將原本抓的檔名改成短檔名,不過都不會改,是哪裡出問題呢?
            RenameFile(FileName,dos_name);
            Form1->Memo1->Lines->Add(FileName "\t" dos_name);  // 此處設置您自己要處理的動作            }
        else if(chkSubDir)  // 如果要檢查次目錄內的檔案
        {  
            if (Sr.Name != "." && Sr.Name != "..")   // 如果不是相對目錄代碼的話
            {  
                DirFiles(Sr.Name.c_str(), true, incPath); // 如果是目錄的話就遞迴處理
                chdir(String("..").c_str());  // 切換回前一層目錄
            }
        }            done = FindNext(Sr);  // 找目錄中的下一個檔案
    }        FindClose(Sr);
}
謝謝大家的指導
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-26 23:52:46 IP:59.104.xxx.xxx 未訂閱
如果我直接把檔案名稱打上去就可以了 例如 RenameFile("abcabcabc.txt","def.txt"); abcabcabc.txt就會轉成 def.txt 我在Memo裡頭看到的FileName 的確是 abcabcabc.txt 而dos_name的確是abcabcabc.txt的短檔名 但是RenameFile(FileName,dos_name); 可以執行但就是無法改過來 謝謝各位的指導
andychang1690
資深會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-27 00:03:27 IP:221.169.xxx.xxx 未訂閱
fbiceo: RenameFile(FileName,String(dos_name)); RenameFile函數原型如下: bool __fastcall RenameFile(const AnsiString OldName, const AnsiString NewName); 請參考! Andy Chang 發表人 - andychang1690 於 2005/07/27 00:04:27
------
Andy Chang
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-27 00:03:46 IP:59.104.xxx.xxx 未訂閱
我發現好像無法直接將檔案名稱改成他的短檔名 例如 abcabcabc.txt 系統抓的短檔名是 ABCABC~1.TXT 如果在資料夾自己直接改為ABCABC~1.TXT會無法修改,還是維持原本 那有辦法用其他的方式改嗎? 謝謝各位解答
Stallion
版主


發表:52
回覆:1600
積分:1995
註冊:2004-09-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-27 00:04:30 IP:211.22.xxx.xxx 未訂閱
RenameFile也是WinAPI要轉成C格式的字串.    ::RenameFile(FileName.c_str(),dos_name); ------------------- 學,然後知不足。 發表人 - stallion 於 2005/07/27 00:05:43
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-27 00:08:45 IP:59.104.xxx.xxx 未訂閱
Hello Andy Chang 您好 感謝您提供的方法,在下有試過一次 而目前的問題是無法直接將檔案改成其短檔名 謝謝您的方法
andychang1690
資深會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-27 00:10:18 IP:221.169.xxx.xxx 未訂閱
引言: 我發現好像無法直接將檔案名稱改成他的短檔名 例如 abcabcabc.txt 系統抓的短檔名是 ABCABC~1.TXT 如果在資料夾自己直接改為ABCABC~1.TXT會無法修改,還是維持原本 那有辦法用其他的方式改嗎? 謝謝各位解答
fbiceo:你所謂的短檔名就是Dos Name,也稱為8.3格式檔名, 檔名最多限8字!檔名一但超過8字8.3格式會採用類似所謂縮排的方式顯示, 也就是你見到的ABCABC~1.TXT但它實際上還是長檔名。你必須要自行判斷處理! 請參考! Andy Chang
------
Andy Chang
fbiceo
一般會員


發表:6
回覆:12
積分:3
註冊:2004-08-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-27 00:24:03 IP:59.104.xxx.xxx 未訂閱
Hello Andy Chang 恩 的確 我需要的短檔名是DOS的檔名格式8.3 GetShortPathName所讀的短檔名ABCABC~1.TXT也是8.3的格式 我是過直接在資料夾下把檔案名稱改成ABCABC~1.TXT會無法修改 謝謝你的回答
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-08-07 23:56:31 IP:61.230.xxx.xxx 未訂閱
fbiceo 您好:    您那段程式碼是我寫的,應該是在下列這篇裡找到的: 如何得到資料夾裡所有的檔案名稱 http://delphi.ktop.com.tw/topic.php?topic_id=74870 我看了您的需求描述後,覺得您似乎是在邏輯上犯了一個小小的錯誤,因為您使用 GetShortPathName() 所取得的短檔名,其實也是原檔名,您將檔案作相同名稱的更名動作,實際上等於是白做了,如果您真的要做到您所描述的動作,那麼我提供兩種方式,應該可以達到您的需求: 1. 取得短檔名之後,先將長檔名更名為一個暫存的檔名,然後再更名為原來的短檔名,也就是以兩次更名動作來做間接更名。 2. 將您原來的更名動作更改如下: RenameFile(FileName, LowerCase(AnsiString(dos_name))); 第二種方式雖然也是直接用取得的短檔名來更名,但是檔案名稱是允許在大小寫不相同時,進行更名動作的。 您試試看吧。 7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2024-06-18 21:47:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!