国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

關于目錄處理的一些函數

2019-11-17 05:35:27
字體:
來源:轉載
供稿:網友
    在編程時,經常有一些針對目錄的操作,如打開目錄對話框選擇一個目錄,直接創建多級目錄,直接刪除多級目錄,判定某個目錄是否存在等。本文就這些問題給出編程實現方法,并給出具體的程序代碼,供各位編程愛好者參考。

一、判定目錄是否存在:

  C++ Builder中提供了檢查文件是否存在的函數FileExists,但沒有提供檢查目錄是否存在的函數,我們可以用Windows API函數FindFirstFile實現這個功能。程序實現如下:

設char *Dir為帶判定的目錄
bool Exist;                                            // 最后結果,表示目錄是否存在
if(Dir[strlen(Dir)]=='//')Dir[strlen(Dir)-1]='/0';    // 先刪除最后的“/”
WIN32_FIND_DATA wfd;                                  // 查找
HANDLE hFind=FindFirstFile(Dir,&wfd);                  
if(hFind==INVALID_HANDLE_VALUE)Exist=false;            // 沒有找到配備,目錄肯定不存在
else
{
    if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DirectorY) // 檢查找到的結果是否目錄
        Exist=true;                                      // 是目錄,目錄存在
    else
        Exist=false;                                    // 是目錄,目錄不存在
    FindClose(hFind);
}

二、打開目錄選擇對話框選擇一個目錄:

  大多專業軟件在要求輸入目錄的編輯框旁都放了一個按鈕,點擊后打開一個目錄窗口,很多編程愛好者也希望能把握這個方法。實現這個功能要調用Windows API函數SHBrowseForFolder,完整聲明為WINSHELLAPI LP99vEMIDLIST WINAPI SHBrowseForFolder(LPBROWSEINFO lpbi),返回一個99vEMIDLIST類型的指針,通過這個指針調用函數SHGetPathFromIDList可以確定所選擇的目錄的全名稱。入參為BROWSEINFO結構的指針,這個結構較為復雜,成員如下所示:

HWND hwndOwner;        // 擁有對話框的窗口,可以設置為application->Handle
LPC99vEMIDLIST pidlRoot; // 99vEMIDLIST類型的指針,表示在哪個路徑下選擇,一般可以設置為NULL

LPSTR pszDisplayName;  // 選擇后,所選目錄的名稱(不包含父級目錄)被拷貝到這個指針指向的位置
LPCSTR lpszTitle;      // 作為標題顯示在對話框中目錄樹的上面,可以根據實際情況設置
UINT ulFlags;          // 標志位,有點復雜,一般設置為BIF_RETURNONLYFSDIRS
BFFCALLBACK lpfn;      // 回調函數,一般不用,設置為NULL
LPARAM lParam;          // 預定義的對話框傳遞給回調函數的值
int iImage;            // 與所選目錄相關聯的圖標在系統圖標集合中的索引
可以看出,使用函數SHBrowseForFolder還真麻煩,普通愛好者把握它確實有一定的難度,現給出完整程序段如下:
#include <shlobj.h>                    // 必須包含的頭文件
char SelectedDir[MAX_PATH];              // 最終結果
BROWSEINFO bi;                          // 入參
char FolderName[MAX_PATH];              // 所選目錄名稱,例如選擇C:/Windows/Font,則為Font
LP99vEMIDLIST ItemID;                    // 所選目錄的系統標志指針

memset(SelectedDir, 0, MAX_PATH);              // 初始化最終結果
memset(&bi, 0, sizeof(BROWSEINFO));    // 初始化入參所有數據
bi.hwndOwner = Application->Handle;
bi.pszDisplayName = FolderName;
bi.lpszTitle = "請選擇目錄";            // 改成自己希望的
bi.ulFlags=BIF_RETURNONLYFSDIRS;
ItemID = SHBrowseForFolder(&bi);      // 調用函數,打開目錄選擇對話框
if(ItemID)
{
    SHGetPathFromIDList(ItemID, SelectedDir);      // 獲取所選目錄的全名
    GlobalFree(ItemID);                      // 返回的ItemID占用了系統資源,不要忘了釋放
}

三、直接建立多級目錄:

  Windows API提供了建立目錄的函數CreateDirectory,但是調用前要保證父目錄必須存在,否則會失敗。其實,有時越級建立多級目錄很有用,因為在建立目錄非凡是建立多層目錄時,層層加以判定會大大地增加程序的復雜程度。如何實現這個功能呢?本人用遞歸方法設計了一個可以直接建立多級目錄的函數,現說明如下,供各位朋友參考。

bool MakeDirectoryEx(const AnsiString &P)  // 入參為打算創建的目錄名,根據操作結果返回"true"或"false"
{
    if(P.IsEmpty())return false;
    int len=P.Length();
    char *Path=P.c_str();
    if(Path[len-1]=='//')

    {
        len--;
        Path[len]='/0';
    }                                      // 刪除末尾的"/"
    AnsiString Dir=Path;
    // 分開父目錄和本身目錄名稱
    AnsiString Parent;
    for(int i=len-1;i>0;i--)
    {
        if(Dir.IsPathDelimiter(i))
        {
            Parent=Dir.SubString(0,i);
            break;
        }
    }
    if(Parent.IsEmpty())return false; // 目錄名稱錯誤
    bool Ret=true;
    if(Parent.Length()>3)          // 假如長度小于3,表示為磁盤根目錄
        Ret=DirectoryExistEx(Parent.c_str());// 檢查父目錄是否存在
    if

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昭通市| 永安市| 长子县| 清水县| 康保县| 石嘴山市| 太湖县| 景宁| 喀喇沁旗| 新津县| 关岭| 吴忠市| 永胜县| 九江县| 盖州市| 栾城县| 于田县| 福州市| 清河县| 灵璧县| 泰和县| 滨海县| 沈阳市| 桑植县| 铅山县| 枣强县| 涟源市| 南郑县| 高淳县| 乐陵市| 增城市| 肥东县| 珠海市| 新绛县| 香河县| 石棉县| 泽库县| 浑源县| 西贡区| 安国市| 特克斯县|