CFileDialog的用法和簡介,讀取多文件

原文地址:http://blog.csdn.net/zmq5411/article/details/6222735

MFC中使用CFile類和CFileDialog可以很簡單的載入和保存文件……

CFileDialog文件選擇對話框的使用:
首先構造一個對象並提供相應的參數,構造函數原型如下:
CFileDialog::CFileDialog(
BOOL bOpenFileDialog, //爲TRUE則顯示打開對話框,爲FALSE則顯示保存對話文件對話框
LPCTSTR lpszDefExt = NULL, //默認的文件擴展名
LPCTSTR lpszFileName = NULL, //默認的文件名
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, //設定風格
LPCTSTR lpszFilter = NULL, //列出可供選擇的文件類型和相應的擴展名
CWnd* pParentWnd = NULL //父窗口句柄指針
);

LPCTSTR lpszFilter 參數格式如:"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc;*.xls|All Files (*.*)|*.*||";文件類型說明和擴展名間用 | 分隔,同種類型文件的擴展名間可以用 ; 分割,每種文件類型間用 | 分隔,末尾用 || 指明。

創建文件對話框可以使用DoModal(),(只有調用了這個方法後纔會彈出你建的CFileDialog對話框)在返回後可以利用下面的函數得到用戶選擇: 
CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目錄名和擴展名如:c:/test/test1.txt 
CString CFileDialog::GetFileName( ) 得到完整的文件名,包括擴展名如:test1.txt 
CString CFileDialog::GetExtName( ) 得到完整的文件擴展名,如:txt 
CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目錄名和擴展名如:test1 
POSITION CFileDialog::GetStartPosition( ) 對於選擇了多個文件的情況得到第一個文件位置。 
CString CFileDialog::GetNextPathName( POSITION& pos ) 對於選擇了多個文件的情況得到下一個文件位置,並同時返回當前文件名。但必須已經調用過POSITION CFileDialog::GetStartPosition( )來得到最初的POSITION變量。

下面是實現代碼:
//打開文件
//創建文件名緩存(fileBuffer)和文件讀取緩存(rBuffer)
//此處如果不把緩存置0,在後面的設定中就會出錯,如果是動態申請的,請用memset或者for循環把數組清零
char fileBuffer[5010] = {0}, rBuffer[5010] = {0};
int rBSize;
//定義一個CFile類,用來處理文件
CFile in;
//定義一個CFileDialog類,用來顯示標準的打開文件對話框
CFileDialog inDlg(FALSE, NULL, NULL, NULL, _T("自定義文件類型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||"), NULL);
inDlg.m_ofn.lpstrTitle = _T("打開自定義文件");
//設定一個文件名緩存,因爲CFileDialog內置的文件名緩存長度只有200,但是很多時候,文件的路徑遠大於這個數,爲了保險起見,所以要自己設定一個文件名緩存
inDlg.m_ofn.lpstrFile = fileBuffer;
//設定緩存長度
inDlg.m_ofn.nMaxFile = 5000;
//顯示對話框,並處理按了確定按鈕的事件
if(inDlg.DoModal() == IDOK) {
//以只讀方式打開文件
if(in.Open(inDlg.GetPathName(), CFile::modeRead)) {
//得到文件長度,從而確定讀取緩存的大小
rBSize = in.GetLength();
//避免數組越界,當然在這裏也可以動態申請緩存空間
if(rBSize > 5000) rBSize = 5000;
//讀入數據
n.Read(rBuffer, rBSize);
//關閉文件
in.Close();
MessageBox("打開文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
} else {
MessageBox("打開文件失敗", "失敗了", MB_ICONSTOP | MB_OK);
}
}

//保存文件
//創建文件名緩存(fileBuffer)和文件寫入緩存(wBuffer)
//此處如果不把緩存置0,在後面的設定中就會出錯,如果是動態申請的,請用memset或者for循環把數組清零
char fileBuffer[5010] = {0}, wBuffer[5010] = {0};
int wBSize;
CFile out;
CFileDialog outDlg(FALSE, NULL, NULL, NULL, _T("自定義文件類型 (*.xxx)|*.xxx|所有文件 (*.*)|*.*||"), NULL);
//設定保存對話框標題
outDlg.m_ofn.lpstrTitle = _T("保存自定義文件");
//使用自定義的文件名緩存
outDlg.m_ofn.lpstrFile = fileBuffer;
//設定保存文件的默認後綴,如果自己有輸入後綴,則時候輸入的後綴
outDlg.m_ofn.lpstrDefExt = "xxx";
//設定緩存大小
outDlg.m_ofn.nMaxFile = 5000;
//顯示對話框
if(outDlg.DoModal() == IDOK) {
//得到文件名,並用創建和寫入方式打開
if(out.Open(outDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) {
//在這裏把你要寫入文件的內容寫入緩存,如果寫入的內容過長,可以分次寫入
//得到寫入當前緩存中內容的長度
wBSize = strlen(wBuffer);
//寫入文件
out.Write(wBuffer, wBSize);
//關閉文件
out.Close();
MessageBox("保存文件成功", "搞定了", MB_ICONEXCLAMATION | MB_OK);
} else {
MessageBox("保存文件失敗", "失敗了", MB_ICONSTOP | MB_OK);
}
}

-----------------------------------------------------------------------------------

VC++ CFileDialog 讀取多個文件

CFileDialog dlg(TRUE, 
"DEM Files (*DEM)", 
NULL, 
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT |OFN_ALLOWMULTISELECT|OFN_ENABLESIZING,
_T("Layer Files (*.DEM;*.TIFF;*.BMP;*.JPG)|*.DEM;*.TIFF;*.BMP;*.JPG;)||"),
NULL);
dlg.m_ofn.lpstrTitle="請加載相關圖層";
//最多可以打開100個文件
dlg.m_ofn.nMaxFile = 100 * MAX_PATH; 
dlg.m_ofn.lpstrFile = new TCHAR[dlg.m_ofn.nMaxFile]; 
ZeroMemory(dlg.m_ofn.lpstrFile, sizeof(TCHAR) * dlg.m_ofn.nMaxFile); 

//顯示文件對話框,獲得文件名集合
int retval = dlg.DoModal();
if(retval==IDCANCEL)
return false;
POSITION pos_file;
pos_file = dlg.GetStartPosition();
CArray<CString, CString> ary_filename;
while(pos_file != NULL)
ary_filename.Add(dlg.GetNextPathName(pos_file));

//根據擴展名讀取相關文件
for(int i=0; i<ary_filename.GetSize(); i++)
{
CString str_ext;
str_ext = ary_filename.GetAt(i).Right(3);
if((str_ext == "DEM")||(str_ext == "dem"))
{
}
else if((str_ext == "TIFF")||(str_ext == "tiff"))
{
}
else if((str_ext == "BMP")||(str_ext == "bmp"))
{
}
else if((str_ext == "JPG")||(str_ext == "jpg"))
{
}
else if((str_ext == "SHP")||(str_ext == "shp"))
{
}

return true

//////////////////////////////////

CFileDialog類封裝了Windows常用的文件對話框。常用的文件對話框提供了一種簡單的與Windows標準相一致的文件打開和文件存盤對話框功能。

  可以用構造函數提供的方式使用CFileDialog,也可以從CFileDialog派生出自己的對話類並編寫一個構造函數來適應你的需要。每種情況下,對話框都與標準MFC對話框一樣工作。因爲它們都是CCommonDialog類的派生類

  要使用CFileDialog,先用CFileDialog構造函數構造一個對象,當創建了一個對話框後,可以設置或修改m_ofn結構中的任何值,以初始化對話框控件的值或狀態。m_ofn結構是OPENFILENAME類型的。要了解更多信息,可參閱聯機文檔“Win32 SDK”中的OPENFILENAME結構。

  初始化對話框控件後,調用DoModal成員函數顯示對話框並使用戶輸入路徑和文件。DoModal返回不論是用戶選擇了OK(IDOK)還是取消(IDCANCEL)按鈕。

  當DoModal返回IDOK,可以使用某一個CFileDIalog的公共成員函數獲取用戶輸入的信息。

  CFileDIalog包含許多保護成員,使你可以處理常用的共享衝突、文件名合法性檢查、列表框改變通知。這些保護成員對許多應用來說用處不大,因爲缺省處理是自動的。對這些函數來說,消息映射入口是不必要的,因爲它們是標準虛函數。

  可以使用Windows CommDlgExtendError函數判斷在初始化對話框時是否是發生了錯誤,並獲取關於錯誤的更多信息。

  析構一個CFileDialog對象是自動,無須調用CDialog::EndDialog。

  要使用戶選用多個文件,可在調用DoModal之前設置OFN_ALLOWMULTISELECT標誌。你應提供文件名緩衝區來放置返回的多個文件名的列表,這通過用一個分配了的緩衝區指針替換m_ofn.lpstrFile來實現,要在創建了CFileDialog之後調用DoModal之前進行此操作。另外,必須用m_ofn.lpstrFile指向的緩衝區字節數來設置m_ofn.nMaxFile。

  CFileDialog依賴於Windows3.1及以後版本中的COMMDLG.DLL。

  如果從CFileDialog中派生出一個新類,可用消息映射處理。要擴展消息處理,從CWnd中派生一個類,向新類中加入一個消息映射併爲新消息提供成員函數,無須提供一個鉤子函數來定製對話框。

  要定製對話框,從CFileDialog中派生一個對象,提供一個定製對話模板,從擴展控件中加入一個消息映射,處理通知消息。任意未處理的消息將傳遞給基類。

  無須定製鉤子函數。

  #include <afxdlgs.h>

  CFileDialog類的成員

/////////////////////////////////

CFileDialog構造一個CFileDialog對象操作

  DoModal顯示對話框並使用戶可以進行選擇

  GetPathName返回選定文件的完整路徑

  GetFileName返回選定文件的文件名

  GetFileExt返回選定文件的擴展文件名

  GetFileTitle返回選定文件的標題

  GetNextPathName返回下一個選定文件的完整路徑

  GetReadOnlyPref返回選定文件的只讀狀態

  GetStartPosition返回文件名列表的第一個元素位置

  可覆蓋的函數

  OnShareViolation發生共享衝突時調用

  OnFileNameOK確認鍵入對話框中的文件名

  OnLBSelChangedNotify當列表框選擇改變時調用

  OnInitDone處理WM_NOTIFY CDN_INITDONE消息

  OnFileNameChange處理WM_NOTIFY CDN_SELCHANGE消息

  OnFolderChange處理WM_NOTIFY CDN_FOLDERCHANGE消息

  OnTypeChange處理WM_NOTIFY CDN_TYPECHANGE消息

  文件選擇對話框的使用:首先構造一個對象並提供相應的參數,構造函數原型如下:

  CFileDialog::CFileDialog( BOOL bOpenFileDialog, LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, CWnd* pParentWnd = NULL );

  參數意義如下:

  bOpenFileDialog 爲TRUE則顯示打開對話框,爲FALSE則顯示保存對話文件對話框。

  lpszDefExt 指定默認的文件擴展名。

  lpszFileName 指定默認的文件名。

  dwFlags 指明一些特定風格。

  lpszFilter 是最重要的一個參數,它指明可供選擇的文件類型和相應的擴展名。參數格式如:

  "Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";文件類型說明和擴展名間用 | 分隔,同種類型文件的擴展名間可以用 ; 分割,每種文件類型間用 | 分隔,末尾用 || 指明。

  pParentWnd 爲父窗口指針。

////////////////////////////////////////

創建文件對話框可以使用DoModal(),在返回後可以利用下面的函數得到用戶選擇:

  CString CFileDialog::GetPathName( ) 得到完整的文件名,包括目錄名和擴展名如:c:/ est/ est1.txt

  CString CFileDialog::GetFileName( ) 得到完整的文件名,包括擴展名如:test1.txt

  CString CFileDialog::GetExtName( ) 得到完整的文件擴展名,如:txt

  CString CFileDialog::GetFileTitle ( ) 得到完整的文件名,不包括目錄名和擴展名如:test1

  POSITION CFileDialog::GetStartPosition( ) 對於選擇了多個文件的情況得到第一個文件位置。

  CString CFileDialog::GetNextPathName( POSITION& pos ) 對於選擇了多個文件的情況得到下一個文件位置,並同時返回當前文件名。但必須已經調用過POSITION CFileDialog::GetStartPosition( )來得到最初的POSITION變量。

  例如

  {

  CString

  FilePathName;

  CFileDialog dlg(TRUE);///TRUE爲OPEN對話框,FALSE爲SAVE AS對話框

  if(dlg.DoModal()==IDOK)

  FilePathName=dlg.GetPathName();

  }

  相關信息:CFileDialog 用於取文件名的幾個成員函數:

  假如選擇的文件是C:WINDOWSTEST.EXE

  則:

  (1)GetPathName();取文件名全稱,包括完整路徑。取回C:/WINDOWS/TEST.EXE

  (2)GetFileName();取文件全名:TEST.EXE

  (3)GetFileTitle();取回TEST

  (4)GetFileExt();取擴展名EXE

  補充: 在控制檯下使用這個類需要設置在靜態庫中使用MFC,然後構造 AfxSetResourceHandle(GetModuleHandle(NULL));

  相關頭文件 #include <Afxdlgs.h>

////////////////////////

文件對話框風格詳解

OFN_ALLOWMULTISELECT 指定文件名列表框允許多選。如果同時你設置了OFN_EXPLORER標記,對話框使用Explorer風格用戶界面;否則它使用舊風格用戶界面。 
  如果用戶選擇了一個以上的文件,lpstrFile緩衝返回當前目錄下所有被選擇的文件的文件名。nFileOffset成員是到第一個文件名的偏移

量(字節或字符),並且nFileExtension成員不被使用。對於Explorer風格對話框,目錄和文件名是被NULL分隔的,在最後的文件名後帶有額外的NULL。這個格式使Explorer風格的對話框能返回包含空格的長文件名。對於舊風格對話框,目錄和文件字符串是被空格分隔的,函數爲帶有空格的文件名使用短文件名。你可以使用FindFirstFile函數在短文件名和長文件名之間轉換。

如果你爲一箇舊風格對話框指定了一個定製的模板,文件名列表框的定義必須包含LBS_EXTENDEDSEL值。

OFN_CREATEPROMPT 如果用戶指定了一個不存在的文件,這個標記使用對話框能提示用戶是否新建這個文件。如果用戶選擇了新建這個文件,對

話框關閉並且函數返回指定的名字;否則,對話框繼續停留。如果你使用帶有OFN_ALLOWMULTISELECT標記的這個標記,對話框允許用戶去指定一個不存在的文件。


OFN_DONTADDTORECENT Windows 2000:防止系統爲選擇的文件增加快捷鏈接到最近使用文檔中。要找回目錄的位置,調用還有

CSIDL_RECENT標記的SHGetSpecialFolderLocation函數。 
  OFN_ENABLEHOOK 激活在lpfnHook成員中指定的鉤子函數。 
  OFN_ENABLEINCLUDENOTIFY Windows 2000:當用戶打開一個文件夾時,引起對話框發送CDN_INCLUDEITEM通知消息到你的OFNHookProc程序

。對話框爲在最近打開的文件夾中的每一個項目發送一個通知。這些消息使你能夠控制那些在對話框中顯示的文件夾項目的列表。


OFN_ENABLESIZING Windows 2000,Windows 98:使Explorer風格的對話框可以使用鼠標或鍵盤調整大小。缺省時,Explorer風格的打開和

另存爲對話框允許被調整大小,不顧這個標記是否被設置。這標記僅在你提供了一個鉤子程序或定製模板時是必需的。舊風格的對話框不允許

調整大小。


OFN_ENABLETEMPLATE 指出lpTemplateName成員是指向對話框模板資源的名字,這個模板資源在能被hInstance成員識別的模塊中。 
  如果OFN_EXPLORER標記被設置,系統使用指定的模板去建立一個對話框,是默認Explorer風格對話框的子窗口。如果OFN_EXPLORER標記沒

有被設置,系統使用舊風格的對話框替代默認的對話框。
  OFN_ENABLETEMPLATEHANDLE 指出hInstance成員能識別的包含預載對話框模板的數據塊。如果這個標記被指定的,系統忽略

lpTemplateName。 
  如果OFN_EXPLORER標記被設置,系統使用指定的模板去建立一個對話框,是默認Explorer風格對話框的子窗口。如果OFN_EXPLORER標記沒

有被設置,系統使用模板去建立一箇舊風格對話框替代默認對話框。


OFN_EXPLORER 指出任何打開或另存爲對話框使用新的Explorer風格的用戶化模塊。關於更多的信息,參見Explorer-Style Hook

Procedures和Explorer-Style Custom Templates。 
  缺省下,打開和另存爲對話框使用Explorer風格用戶界面,不顧這個標記是否設置。這個標記僅在你提供了一個鉤子程序或定製模板或設

置了OFN_ALLOWMULTISELECT標記時是必需的。
  如果你想使用舊風格的界面,省略OFN_EXPLORER 標記,並且提供一個代替的舊風格模板或鉤子程序。如果你想用舊風格但不需要一個定製

模板或鉤子程序,簡單的提供一個鉤子程序,讓它返回FALSE。
  OFN_EXTENSIONDIFFERENT 指定用戶輸入的一個文件的擴展名與lpstrDefExt指定的擴展名不同。如果lpstrDefExt是NULL,函數不使用這個

標記。 
  OFN_FILEMUSTEXIST 指定用戶僅可以在文件名登錄字段中輸入已存在的文件的名字。如果這個標記被指定的並且用戶輸入了一個無效的名

字,對話框程序顯示一個等待消息框。如果這個標記被指定,OFN_PATHMUSTEXIST標記也被使用。 
  OFN_FORCESHOWHIDDEN Windows 2000:強制顯示系統和隱藏屬性的文件,從而壓倒用戶設置的顯示或不顯示隱藏文件。否則,帶有系統和

隱藏標記的文件不被顯示。 
  OFN_HIDEREADONLY 隱藏只讀複選框。 
  OFN_LONGNAMES 對於舊風格對話框,這個標記引起對話框使用長文件名。如果這個標記沒有被指定,或如果OFN_ALLOWMULTISELECT標記也

被設置,舊風格對話框爲帶有空格的文件名使用短文件名(8.3格式)。 
  Explorer風格對話框忽略這個標記,通常顯示長文件名。
  OFN_NOCHANGEDIR 如果當搜索文件時用戶改變了目錄的時候,恢復當前目錄到它的初始值。 
  OFN_NODEREFERENCELINKS 引導對話框爲選擇的快捷方式(.LNK)文件返回路徑和文件名。如果這個值沒有被指定,對話框返回這個快捷方

式所引用文件的路徑和文件名。 
  OFN_NOLONGNAMES 對於舊風格對話框,這個標識引起對話框去使用短文件名(8.3格式)。 
  Explorer風格對話框忽略這個標記,通常顯示長文件名。
  OFN_NONETWORKBUTTON 隱藏和顯示風格按鈕。 
  OFN_NOREADONLYRETURN 指定返回的文件不帶有隻讀複選框,不是在寫保護的目錄中。 
  OFN_NOTESTFILECREATE 指定文件不是在對話框關閉前建立的。如果應用程序保存文件到一個建立的非映象風格共享上,這個標記應該被指

定的。當一個應用程序指定了這標記,庫不能檢查寫保護,磁盤滿,打開驅動器門或網絡保護。應用程序使用這個標記必須小心執行文件操作

,因爲一旦文件被關閉,它不能重新打開。 
  OFN_NOVALIDATE 指定公共對話框允許在返回的文件名中有無效的字符。典型的,正在調用的程序使用一個鉤子程序通過FILEOKSTRING消息

檢查文件名。如果在編輯控件中的文本框是空的或只包含了空格,那麼文件和目錄列表框是被更新的。如果編輯控件中的文本框包含了別的東

西,那麼nFileOffset和nFileExtension的設置值是通過分析文本產生的。沒有默認的擴展名被添加到文本,也沒有文本被複制到

lpstrFileTitle指定的緩衝。 
  如果通過nFileOffset指定的值比0小,文件是無效的。否則,文件名是有效的。如果OFN_NOVALIDATE沒有被指定,nFileExtension和

nFileOffset可以被使用。
  OFN_OVERWRITEPROMPT 如果選擇的文件已經存在,使用另存爲對話框產生一個消息框。用戶必須確認是否覆蓋這個文件。 
  OFN_PATHMUSTEXIST 指定用戶僅能輸入的路徑和文件名。如果這個標記被使用並且用戶在文件名輸入字段中鍵入了一個用效的路徑和文件

名,對話框函數顯示一個等待消息。 
  OFN_READONLY 當對話框建立時,顯示被選擇的只讀複選框。這個標記指出當對話框被關閉時只讀複選框的狀態。 
  OFN_SHAREAWARE 指出如果調用OpenFile函數因爲網絡共享衝突而失敗,這個錯誤被忽略並且對話框返回選擇的文件名。 
  如果這個標記沒有被設置,當用戶選擇的文件名發生網絡共享衝突時,對話框發送通知到你的鉤子程序。如果你設置了OFN_EXPLORER標記

,對話框發送CDN_SHAREVIOLATION消息到鉤子程序。如果你沒有設置OFN_EXPLORER,對話框發送SHAREVISTRING註冊的消息到鉤子程序。
  OFN_SHOWHELP 使對話框顯示幫助按鈕。hwndOwner成員必須指定一個窗口,這個窗口作爲接收對話框發送的HELPMSGSTRING註冊的消息,當

用戶單擊幫助按鈕時對話框發送這個消息。 
  當用戶單擊幫助按鈕時,一個Explorer風格的對話框發送CDN_HELP通知消息到你的鉤子程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章