當前位置:首頁 » 文件管理 » c獲取文件夾屬性

c獲取文件夾屬性

發布時間: 2022-09-18 20:55:50

A. c語言怎麼讀取某一文件夾下的所有文件夾和文件

讀取的代碼方式如下:

int main()

{

long file;

struct _finddata_t find;

_chdir("d:\");

if((file=_findfirst("*.*", &find))==-1L)

{

printf("空白! ");

exit(0);

}

printf("%s ", find.name);

while(_findnext(file, &find)==0)

{

printf("%s ", find.name);

}

_findclose(file);

return 0;

}

B. c語言如何通過文件屬性獲取文件大小

在"stdio.h"中有如下定義
struct _iobuf {
char *_ptr; //文件輸入的下一個位置
int _cnt; //當前緩沖區的相對位置
char *_base; //指基礎位置(即是文件的其始位置)
int _flag; //文件標志
int _file; //文件的有效性驗證
int _charbuf; //檢查緩沖區狀況,如果無緩沖區則不讀取
int _bufsiz; //文件的大小
char *_tmpfname; //臨時文件名
};
typedef struct _iobuf FILE;

C. c++中,如何獲得文件屬性(創建時間,修改時間,訪問時間)

如果是windows平台,使用如下API:

HANDLE WINAPI FindFirstFile(
__in LPCTSTR lpFileName, //文件路徑
__out LPWIN32_FIND_DATA lpFindFileData //文件屬性信息
);
該函數可以獲取文件制定文件包括時間在內的屬性信息。這些信息包含在第二個參數執行的結構中:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime; //文件創建時間
FILETIME ftLastAccessTime; //文件訪問時間
FILETIME ftLastWriteTime; //最近一次修改時間
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH];
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

其中時間FILETIME結構體如下:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
MSDN不推薦自己加減獲取系統格式的時間,而是推薦使用
BOOL WINAPI FileTimeToSystemTime(
__in const FILETIME *lpFileTime, //上面獲取的時間
__out LPSYSTEMTIME lpSystemTime //系統時間
);

這里獲取的是系統時間:
typedef struct _SYSTEMTIME {
WORD wYear; //年
WORD wMonth; //月
WORD wDayOfWeek; //周幾
WORD wDay; //日
WORD wHour; //時
WORD wMinute; //分
WORD wSecond; //秒
WORD wMilliseconds; //毫秒
} SYSTEMTIME, *PSYSTEMTIME;

至此,時間成功獲取
實例代碼:
BOOL FileAttributes( LPCTSTR lpszFilePath/*文件路徑*/ )
{
WIN32_FIND_DATA FindFileData = { 0 };

HANDLE hFile = ::FindFirstFile(lpszFilePath, &FindFileData);

if( INVALID_HANDLE_VALUE == hFile )

{ //handling error
return FALSE;
}
SYSTEMTIME CreateTime = { 0 }; //創建時間
SYSTEMTIME AccessTime = { 0 }; //最近訪問時間
SYSTEMTIME WriteTime = { 0 }; //最近修改時間
if( !::FileTimeToSystemTime( FindFileData.ftCreationTime , &CreateTime) )
{
//handling error
return FALSE;
}
if( !::FileTimeToSystemTime( FindFileData.ftLastAccessTime , &AccessTime) )
{
//handling error
return FALSE;
}
if( !::FileTimeToSystemTime( FindFileData.ftLastWriteTime, &WriteTime))
{
//handling error
return FALSE;
}
//OK 獲取時間了,可以使用時間了

::CloseHandle( hFile );

return TRUE;
}
如果用MFC實現就簡單了點:
直接用
static void PASCAL SetStatus(
LPCTSTR lpszFileName,
const CFileStatus& status,
CAtlTransactionManager* pTM = NULL
);
這個靜態成員就好了
struct CFileStatus
{
CTime m_ctime; // creation date/time of file 創建時間
CTime m_mtime; // last modification date/time of file 最近修改時間
CTime m_atime; // last access date/time of file 最近訪問時間
ULONGLONG m_size; // logical size of file in bytes
DWORD m_attribute; // logical OR of CFile::Attribute enum values
TCHAR m_szFullName[_MAX_PATH]; // absolute path name
};

示例:
TCHAR* pFileName = _T("ReadOnly_File.dat");
CFileStatus status;
CFile::GetStatus(pFileName, status);
//status中就有時間
//直接用CTime的Format函數格式化為隨意形式的時間字元串格式即可

D. C#獲取如何獲取指定文件夾下文件的個數、

C#遍歷指定文件夾中的所有文件
DirectoryInfo TheFolder=new DirectoryInfo(folderFullName);
//遍歷文件夾
foreach(DirectoryInfo NextFolder in TheFolder.GetDirectories())
this.listBox1.Items.Add(NextFolder.Name);
//遍歷文件
foreach(FileInfo NextFile in TheFolder.GetFiles())
this.listBox2.Items.Add(NextFile.Name);
===================================================================
如何獲取指定目錄包含的文件和子目錄
1. DirectoryInfo.GetFiles():獲取目錄中(不包含子目錄)的文件,返回類型為FileInfo[],支持通配符查找;
2. DirectoryInfo.GetDirectories():獲取目錄(不包含子目錄)的子目錄,返回類型為DirectoryInfo[],支持通配符查找;
3. DirectoryInfo. GetFileSystemInfos():獲取指定目錄下(不包含子目錄)的文件和子目錄,返回類型為FileSystemInfo[],支持通配符查找;
如何獲取指定文件的基本信息;
FileInfo.Exists:獲取指定文件是否存在;
FileInfo.Name,FileInfo.Extensioin:獲取文件的名稱和擴展名;
FileInfo.FullName:獲取文件的全限定名稱(完整路徑);
FileInfo.Directory:獲取文件所在目錄,返回類型為DirectoryInfo;
FileInfo.DirectoryName:獲取文件所在目錄的路徑(完整路徑);
FileInfo.Length:獲取文件的大小(位元組數);
FileInfo.IsReadOnly:獲取文件是否只讀;
FileInfo.Attributes:獲取或設置指定文件的屬性,返回類型為FileAttributes枚舉,可以是多個值的組合
FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分別用於獲取文件的創建時間、訪問時間、修改時間;

假設a文件夾在F盤下,代碼如下。將文件名輸出到一個ListBox中
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)
{
DirectoryInfo theFolder = new DirectoryInfo(@"F:\a\");
DirectoryInfo[] dirInfo = theFolder.GetDirectories();
//遍歷文件夾
foreach (DirectoryInfo NextFolder in dirInfo)
{
// this.listBox1.Items.Add(NextFolder.Name);
FileInfo[] fileInfo = NextFolder.GetFiles();
foreach (FileInfo NextFile in fileInfo) //遍歷文件
this.listBox2.Items.Add(NextFile.Name);
}

}
}
}

E. vc函數GetFileTime獲取文件夾的訪問時間時問題

通常,文件、文件夾的時間屬性指的是創建時間、最近訪問時間和最近修改時間等幾個具體屬性。對於文件的上述屬性可以通過GetFileTime()來獲取,對於文件夾,在通過CreateFile()函數將其打開後,其獲取得到的句柄可以當作文件句柄來使用。因此,通過GetFileTime()函數同樣也可以得到文件夾的時間屬性。GetFileTime()函數原型如下:
BOOLGetFileTime(
HANDLE hFile, // 文件句柄
LPFILETIME lpCreationTime, // 創建時間的地址
LPFILETIME lpLastAccessTime, //最近訪問時間的地址
LPFILETIME lpLastWriteTime // 最近修改時間的地址
);
其中後三個參數均是指向FILETIME結構的指針,得到的也都是UTC時間,如果需要,可以通過FileTimeToLocalFileTime()函數將此UTC時間轉化成本地時間。而且還可以進一步通過FileTimeToSystemTime()函數將其從文件時間格式轉化成系統時間格式,轉化後的時間格式將保存在一個SYSTEMTIME結構對象中。類似的,在將時間信息寫入到文件夾屬性時,如果不是文件時間格式也應當通過SystemTimeToFileTime()函數將其從系統時間格式轉換成文件時間格式,然後再通過SetFileTime()函數將指定的時間寫入到文件夾的時間屬性中去。這樣,在進行數據備份和恢復的過程中,包括根目錄在內的所有文件夾都可以保持時間屬性的一致。

// 獲取指定文件夾的時間屬性,入口參數DirName指定了待處理的文件夾,
//stime為一指向SYSTEMTIME結構的指針
BOOLCSetForderTimeDlg::GetDirTime(CString DirName, SYSTEMTIME &stime){
// 打開文件夾
HANDLE hDir = CreateFile (DirName,GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 文件夾的創建時間
FILETIME lpLastAccessTime; // 對文件夾的最近訪問時間
FILETIME lpLastWriteTime; // 文件夾的最近修改時間
// 獲取文件夾時間屬性信息
if (GetFileTime(hDir,&lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){
FILETIME ftime;
FileTimeToLocalFileTime(&lpLastWriteTime,&ftime); // 轉換成本地時間
FileTimeToSystemTime(&ftime,&stime); // 轉換成系統時間格式
}
CloseHandle(hDir); // 關閉打開過的文件夾
return retval;
}
// 設置指定文件夾的時間屬性,入口參數DirName指定了待處理的文件夾,
//new_time為一指向SYSTEMTIME結構的指針
BOOLCSetForderTimeDlg::SetDirTime(CString DirName, SYSTEMTIME new_stime){
// 打開目錄的Win32 API調用
HANDLE hDir = CreateFile(DirName,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_DELETE,
NULL, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS, NULL);
FILETIME lpCreationTime; // 文件夾的創建時間
FILETIME lpLastAccessTime; // 對文件夾的最近訪問時間
FILETIME lpLastWriteTime; // 對文件夾的最近修改時間
SystemTimeToFileTime(&new_stime,&lpCreationTime); // 轉換成文件時間格式
SystemTimeToFileTime(&new_stime,&lpLastAccessTime);
SystemTimeToFileTime(&new_stime,&lpLastWriteTime);

CloseHandle(hDir); // 關閉文件夾
return retval;
}

F. 怎樣可以得到文件的,創建日期等文件屬性

使用如下API:

HANDLE WINAPI FindFirstFile(
__in LPCTSTR lpFileName, //文件路徑
__out LPWIN32_FIND_DATA lpFindFileData //文件屬性信息
);
該函數可以獲取文件制定文件包括時間在內的屬性信息。這些信息包含在第二個參數執行的結構中:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime; //文件創建時間
FILETIME ftLastAccessTime; //文件訪問時間
FILETIME ftLastWriteTime; //最近一次修改時間
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[MAX_PATH];
TCHAR cAlternateFileName[14];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

其中時間FILETIME結構體如下:
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
MSDN不推薦自己加減獲取系統格式的時間,而是推薦使用
BOOL WINAPI FileTimeToSystemTime(
__in const FILETIME *lpFileTime, //上面獲取的時間
__out LPSYSTEMTIME lpSystemTime //系統時間
);

這里獲取的是系統時間:
typedef struct _SYSTEMTIME {
WORD wYear; //年
WORD wMonth; //月
WORD wDayOfWeek; //周幾
WORD wDay; //日
WORD wHour; //時
WORD wMinute; //分
WORD wSecond; //秒
WORD wMilliseconds; //毫秒
} SYSTEMTIME, *PSYSTEMTIME;

至此,時間成功獲取
實例代碼:
BOOL FileAttributes( LPCTSTR lpszFilePath/*文件路徑*/ )
{
WIN32_FIND_DATA FindFileData = { 0 };

HANDLE hFile = ::FindFirstFile(lpszFilePath, &FindFileData);

if( INVALID_HANDLE_VALUE == hFile )

{ //handling error
return FALSE;
}
SYSTEMTIME CreateTime = { 0 }; //創建時間
SYSTEMTIME AccessTime = { 0 }; //最近訪問時間
SYSTEMTIME WriteTime = { 0 }; //最近修改時間
if( !::FileTimeToSystemTime( FindFileData.ftCreationTime , &CreateTime) )
{
//handling error
return FALSE;
}
if( !::FileTimeToSystemTime( FindFileData.ftLastAccessTime , &AccessTime) )
{
//handling error
return FALSE;
}
if( !::FileTimeToSystemTime( FindFileData.ftLastWriteTime, &WriteTime))
{
//handling error
return FALSE;
}
//OK 獲取時間了,可以使用時間了

::CloseHandle( hFile );

return TRUE;
}
如果用MFC實現就簡單了點:
直接用
static void PASCAL SetStatus(
LPCTSTR lpszFileName,
const CFileStatus& status,
CAtlTransactionManager* pTM = NULL
);
這個靜態成員就好了
struct CFileStatus
{
CTime m_ctime; // creation date/time of file 創建時間
CTime m_mtime; // last modification date/time of file 最近修改時間
CTime m_atime; // last access date/time of file 最近訪問時間
ULONGLONG m_size; // logical size of file in bytes
DWORD m_attribute; // logical OR of CFile::Attribute enum values
TCHAR m_szFullName[_MAX_PATH]; // absolute path name
};

示例:
TCHAR* pFileName = _T("ReadOnly_File.dat");
CFileStatus status;
CFile::GetStatus(pFileName, status);
//status中就有時間
//直接用CTime的Format函數格式化為隨意形式的時間字元串格式即可

G. 如何用C語言獲取文件的大小

C語言中獲取文件大小方式有很多,在不使用任何系統命令,僅使用C自身庫函數情況下,常用方式有兩種:

一、獲取文件系統屬性,讀取文件大小。

在C語言庫函數中有stat函數,可以獲取文件的基本信息,其中就有文件大小。

#include<sys/stat.h>//包含頭文件。
intfile_size(char*filename)//獲取文件名為filename的文件大小。
{
structstatstatbuf;
intret;
ret=stat(filename,&statbuf);//調用stat函數
if(ret!=0)return-1;//獲取失敗。
returnstatbuf.st_size;//返迴文件大小。
}

二、通過C語言文件操作,獲取文件大小。

以fopen打開的文件,通過fseek可以定位到文件尾,這時使用ftell函數,返回的文件指針偏移值,就是文件的實際大小。

代碼如下:

#include<stdio.h>//包含頭文件。
intfile_size(char*filename)//獲取文件名為filename的文件大小。
{
FILE*fp=fopen(filename,"rb");//打開文件。
intsize;
if(fp==NULL)//打開文件失敗
return-1;
fseek(fp,0,SEEK_END);//定位文件指針到文件尾。
size=ftell(fp);//獲取文件指針偏移量,即文件大小。
fclose(fp);//關閉文件。
returnsize;
}

三、注意事項:

第一種方式為直接讀取文件信息,無需打開文件,所以更高效。

四、測試代碼:

以上介面函數,均可以用如下主函數測試:

#include<stdio.h>
intmain()
{
chars[100];
intsize;
scanf("%s",s);//輸入文件名
size=file_size(s);//獲取文件大小。
if(size==-1)printf("無法獲取文件大小,可能文件並不存在或不可讀 ");
elseprintf("文件大小為%d ",size);
return0;
}

H. 如何批量獲取一個文件夾下的文件屬性,然後存入資料庫

使用Visual C++編程,有如下方法進行文件操作:

(1)使用標准C運行庫函數,包括fopen、fclose、fseek等。

(2)使用Win16下的文件和目錄操作函數,如lopen、lclose、lseek等。不過,在Win32下,這些函數主要是為了和Win16向後兼容。

(3)使用Win32下的文件和目錄操作函數,如CreateFile,CopyFile,DeleteFile,FindNextFile,等等。

Win32下,打開和創建文件都由CreateFile完成,成功的話,得到一個Win32下的句柄,這不同於「C」的fopen返回的句柄。在Win16下,該句柄和C運行庫文件操作函數相容。但在Win32下,「C」的文件操作函數不能使用該句柄,如果需要的話,可以使用函數_open_osfhandle從Win32句柄得到一個「C」文件函數可以使用的文件句柄。

關閉文件使用Win32的CloseHandle。

在Win32下,CreateFile可以操作的對象除了磁碟文件外,還包括設備文件如通訊埠、管道、控制台輸入、郵件槽等等。

(4)使用CFile和其派生類進行文件操作。CFile從CObject派生,其派生類包括操作文本文件的CStdioFile,操作內存文件的CmemFile,等等。

CFile是建立在Win32的文件操作體系的基礎上,它封裝了部分Win32文件操作函數。

最好是使用CFile類(或派生類)的對象來操作文件,必要的話,可以從這些類派生自己的文件操作類。統一使用CFile的界面可以得到好的移植性。

MFC的文件類

MFC用一些類來封裝文件訪問的Win32 API。以CFile為基礎,從CFile派生出幾個類,如CStdioFile,CMemFile,MFC內部使用的CMiororFile,等等。

CFile的結構

CFile定義的枚舉類型

CFile類定義了一些和文件操作相關的枚舉類型,主要有四種:OpenFlags,Attribute,SeekPosition,hFileNull。下面,分別解釋這些枚舉類型。

OpenFlags

OpenFlags定義了13種文件訪問和共享模式:

enum OpenFlags {

//第一(從右,下同)至第二位,打開文件時訪問模式,讀/寫/讀寫

modeRead = 0x0000,

modeWrite = 0x0001,

modeReadWrite = 0x0002,

shareCompat = 0x0000, //32位MFC中沒用

//第五到第七位,打開文件時的共享模式

shareExclusive = 0x0010,//獨占方式,禁止其他進程讀寫

shareDenyWrite = 0x0020,//禁止其他進程寫

shareDenyRead = 0x0030,//禁止其他進程讀

shareDenyNone = 0x0040,//允許其他進程寫

//第八位,打開文件時的文件繼承方式

modeNoInherit = 0x0080,//不允許子進程繼承

//第十三、十四位,是否創建新文件和創建方式

modeCreate = 0x1000,//創建新文件,文件長度0

modeNoTruncate = 0x2000,//創建新文件時如文件已存在則打開

//第十五、十六位,文件以二進制或者文本方式打開,在派生類CStdioFile中用

typeText = 0x4000,

typeBinary = (int)0x8000

};

Attribute

Attribute定義了文件屬性:正常、只讀、隱含、系統文件,文件或者目錄等。

enum Attribute {

normal = 0x00,

readOnly = 0x01,

hidden = 0x02,

system = 0x04,

volume = 0x08,

directory = 0x10,

archive = 0x20

}

SeekPosition

SeekPosition定義了三種文件位置:頭、尾、當前:

enum SeekPosition{

begin = 0x0,

current = 0x1,

end = 0x2

};

hFileNull

hFileNull定義了空文件句柄

enum { hFileNull = -1 };

CFile的其他一些成員變數

CFile除了定義枚舉類型,還定義了一些成員變數。例如:

UINT m_hFile

該成員變數是public訪問屬性,保存::CreateFile返回的操作系統的文件句柄。MFC重載了運算符號HFILE來返回m_hFile,這樣在使用HFILE類型變數的地方可以使用CFile對象。

BOOL m_bCloseOnDelete;

CString m_strFileName;

這兩個成員變數是protected訪問屬性。m_bCloseOnDelete用來指示是否在關閉文件時刪除CFile對象;m_strFileName用來保存文件名。

CFile的成員函數

CFile的成員函數實現了對Win32文件操作函數的封裝,完成以下動作:打開、創建、關閉文件,文件指針定位,文件的鎖定與解鎖,文件狀態的讀取和修改,等等。其中,用到了m_hFile文件句柄的一般是虛擬函數,和此無關的一般是靜態成員函數。一般地,成員函數被映射到對應的Win32函數,如表11-1所示。

表11-1 CFile函數對Win32文件函數的封裝

虛擬
靜態
成員函數
對應的Win32函數

文件的創建、打開、關閉

√
Abort
CloseHandle

√
Duplicate
DuplicateHandle

√
Open
CreateFile

√
Close
CloseHandle

文件的讀寫

√
Read
ReadFile

ReadHuge(向後兼容)
調用Read成員函數

√
Write
WriteFile

WriteHuage(向後兼容)
調用Write成員函數

√
Flush
FlushFileBuffers

文件定位

√
Seek
SetFilePointer

SeekToBegin
調用Seek成員函數

SeekToEnd
調用Seek成員函數

√
GetLength
調用Seek成員函數

√
SetLength
SetEndOfFile

文件的鎖定/解鎖

√
LockRange
LockFile

√
UnlockRange
UnlockFile

文件狀態操作函數

√
GetPosition
SetFilePointer

GetStatus(CFileStatus&)
GetFileTime,GetFileSize等

√
GetStatus(LPSTR lpszFileName CFileStatus&)
FindFirstFile

√
GetFileName
不是簡單地映射到某個函數

√
GetFileTitle

√
GetFilePath

√
SetFilePath

√
SetStatus

改名和刪除

√
Rename
MoveFile

√
Remove
DeleteFile

CFile的部分實現

這里主要討論CFile對象的構造函數和文件的打開/創建的過程。

構造函數

CFile有如下幾個構造函數:

CFile()

預設構造函數,僅僅構造一個CFile對象,還必須使用Open成員函數來打開文件。

CFile(int hFile)

已經打開了一個文件hFile,在此基礎上構造一個CFile對象來給它打包。HFile將被賦值給CFile的成員變數m_hFile。

CFile(LPCTSTR lpszFileName, UINT nOpenFlags)

指定一個文件名和文件打開方式,構造CFile對象,調用Open打開/創建文件,把文件句柄保存到m_hFile。

打開/創建文件

Open的原型如下:

BOOL CFile::Open(LPCTSTR lpszFileName, UINT nOpenFlags,

CFileException* pException)

Open調用Win32函數::CreateFile打開文件,並把文件句柄保存到成員變數m_hFile中。

CreateFile函數的原型如下:

HANDLE CreateFile(

LPCTSTR lpFileName,// pointer to name of the file

DWORD dwDesiredAccess,// access (read-write) mode

DWORD dwShareMode,// share mode

LPSECURITY_ATTRIBUTES lpSecurityAttributes, //pointer to security descriptor

DWORD dwCreationDistribution,// how to create

DWORD dwFlagsAndAttributes,// file attributes

HANDLE hTemplateFile// handle to file with attributes to

);

顯然,Open必須把自己的兩個參數lpszFileName和nOpenFlags映射到CreateFile的七個參數上。

從OpenFlags的定義可以看出,(nOpenFlags & 3)表示了讀寫標識,映射成變數dwAccess,可以取值為Win32的GENERIC_READ、GENERIC_WRITE、GENERIC_READ|GENERIC_WRITE。

(nOpenFlags & 0x70)表示了共享模式,映射成變數dwShareMode,可以取值為Win32的FILE_SHARE_READ、FILE_SHARE_WRITE、FILE_SHARE_WRITE|FILE_SHARE_READ。

Open定義了一個局部的SECURITY_ATTRIBUTES變數sa,(nOpenFlags & 0x80)被賦值給sa.bInheritHandle。

(nOpenFlags & modeCreate)表示了創建方式,映射成變數dwCreateFlag,可以取值為Win32的OPEN_ALWAYS、CREATE_ALWAYS、OPEN_EXISTING。

在生成了上述參數之後,先調用::CreateFile:

HANDLE hFile =::CreateFile(lpszFileName,

dwAccess, dwShareMode, &sa,

dwCreateFlag, FILE_ATTRIBUTE_NORMAL, NULL);

然後,hFile被賦值給成員變數m_hFile,m_bCloseOnDelete被設置為TRUE。

由上可以看出,CFile打開(創建)一個文件時大大簡化了:: CreateFile函數的復雜性,即只需要指定一個文件名、一個打開文件的參數即可。若該參數指定為0,則表示以只讀方式打開一個存在的文件,獨占使用,不允許子進程繼承。

在CFile對象使用時,如果它是在堆中分配的,則應該銷毀它;如果在棧中分配的,則CFile對象將被自動銷毀。銷毀時析構函數被調用,析構函數是虛擬函數。若m_bCloseOnDelete為真且m_hFile非空,則析構函數調用Close關閉文件。

至於其他CFile成員函數的實現,這里不作分析了。

CFile的派生類

這里主要簡要地介紹CStdioFile和CmemFile及CFileFind。

CStdioFile

CStdioFile對文本文件進行操作。

CStdioFile定義了新的成員變數m_pStream,類型是FILE*。在打開或者創建文件時,使用_open_osfhandle從m_hFile(Win32文件句柄)得到一個「C」的FILE類型的文件指針,然後,在文件操作中,使用「C」的文件操作函數。例如,讀文件使用_fread,而不是::ReadFile,寫文件使用了_fwrite,而不是::WriteFile,等等。m_hFile是CFile的成員變數。

另外,CStdioFile不支持CFile的Dumplicate、LockRange、UnlockRange操作,但是實現了兩個新的操作ReadString和WriteString。

CMemFile

CMemFile把一塊內存當作一個文件來操作,所以,它沒有打開文件的操作,而是設計了Attach和Detach用來分配或者釋放一塊內存。相應地,它提供了Alloc、Free虛擬函數來操作內存文件,它覆蓋了Read、Write來讀寫內存文件。

CFileFind

為了方便文件查找,MFC把有關功能歸結成為一個類CFileFind。CFileFind派生於CObject類。首先,它使用FindFile和FineNextFile包裝了Win32函數::FindFirstFile和::FindNextFile;其次,它提供了許多函數用來獲取文件的狀態或者屬性。

使用CFileStatus結構來描述文件的屬性,其定義如下:

struct CFileStatus

{

CTime m_ctime; // 文件創建時間

CTime m_mtime; // 文件最近一次修改時間

CTime m_atime; // 文件最近一次訪問時間

LONG m_size; // 文件大小

BYTE m_attribute; // 文件屬性

BYTE _m_padding; // 沒有實際含義,用來增加一個位元組

TCHAR m_szFullName[_MAX_PATH]; //絕對路徑

#ifdef _DEBUG

//實現Dump虛擬函數,輸出文件屬性

void Dump(CDumpContext& dc) const;

#endif

};

例如:

CFileStatus status;

pFile->GetStatus(status);

#ifdef _DEBUG

status.mp(afxDump);

#endif

I. c語言如何通過文件屬性獲取文件大小

c語言可以通過stat()函數獲得文件屬性,通過返回的文件屬性,從中獲取文件大小。

#include <sys/stat.h> 可見以下結構體和函數

struct stat {

_dev_t st_dev;

_ino_t st_ino;

unsigned short st_mode;

short st_nlink;

short st_uid;

short st_gid;

_dev_t st_rdev;

_off_t st_size; //文件大小

time_t st_atime;

time_t st_mtime;

time_t st_ctime;

};

stat(const char *, struct _stat *); //根據文件名得到文件屬性

參考代碼:

#include<sys/stat.h>
voidmain()
{
structstatbuf;
if(stat("test.txt",&buf)<0)
{
perror("stat");
return;
}
printf("filesize:%d ",buf.st_size);
}

J. 怎麼用C語言為文件夾添加只讀屬性

attrib為dos下修改文件屬性的命令,其格式如下:
ATTRIB
[+R
|
-R]
[+A
|
-A
]
[+S
|
-S]
[+H
|
-H]
[drive:][path][filename]
[/S
[/D]]
參數說明:
+
設定屬性;
-
清除屬性;
R
只讀;
A
存檔;
S
系統文件;
H
隱藏;
[drive:][path][filename]指定欲改變屬性的文件夾或文件的路徑,省略drive:,path時,默認為當前路徑;
/S
處理當前文件夾和子文件夾中所有的文件;
/D
處理的項目包括子文件夾。
注意:修改除隱藏外的其他屬性時,文件應為非隱藏!
比如:你想給文件c:\xxx.ext加上只讀和隱藏屬性,可以這樣寫:attrib
+r
+h
c:\xxx.ext
去除改為-號就好了。
在C語言下使用system("attrib
+r
+h
c:\\xxx.ext");來完成,代碼如下:
#include
#include
void
main()
{
system("attrib
+r
c:\\data.txt");
}

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:1336
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:1606
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:1324
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:1463
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:1324
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1708
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:888
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:804
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:1446
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:1589