當前位置:首頁 » 文件管理 » 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");
}

熱點內容
餐館許可證編號密碼是什麼 發布:2024-10-10 18:17:52 瀏覽:269
我的世界網易電腦版怎麼玩手機伺服器 發布:2024-10-10 18:06:16 瀏覽:28
客戶伺服器怎麼調查 發布:2024-10-10 17:56:05 瀏覽:35
軟體反編譯教程 發布:2024-10-10 17:50:14 瀏覽:12
uc瀏覽器android 發布:2024-10-10 17:50:13 瀏覽:16
字母大小寫編程 發布:2024-10-10 17:25:40 瀏覽:632
安卓大陸用戶怎麼玩傳說對決 發布:2024-10-10 17:11:56 瀏覽:432
上傳照片登錄 發布:2024-10-10 17:00:27 瀏覽:829
用友nc伺服器的ip地址是什麼 發布:2024-10-10 17:00:27 瀏覽:293
雲伺服器雙線 發布:2024-10-10 16:52:18 瀏覽:164