你的问题可以这样解决:
首先你要使用vb
api函数以及api结构:
Public
Type
BY_HANDLE_FILE_INFORMATION
dwFileAttributes
As
Long
ftCreationTime
As
FILETIME
ftLastAccessTime
As
FILETIME
ftLastWriteTime
As
FILETIME
dwVolumeSerialNumber
As
Long
nFileSizeHigh
As
Long
nFileSizeLow
As
Long
nNumberOfLinks
As
Long
nFileIndexHigh
As
Long
nFileIndexLow
As
Long
End
Type
Public
Type
OFSTRUCT
cBytes
As
Byte
fFixedDisk
As
Byte
nErrCode
As
Integer
Reserved1
As
Integer
Reserved2
As
Integer
szPathName(OFS_MAXPATHNAME)
As
Byte
End
Type
Public
Declare
Function
OpenFile
Lib
"kernel32"
Alias
"OpenFile"
(ByVal
lpFileName
As
String,
lpReOpenBuff
As
OFSTRUCT,
ByVal
wStyle
As
Long)
As
Long
Public
Declare
Function
GetFileInformationByHandle
Lib
"kernel32"
Alias
"GetFileInformationByHandle"
(ByVal
hFile
As
Long,
lpFileInformation
As
BY_HANDLE_FILE_INFORMATION)
As
Long
关键的语句是:
dim
lp
as
OFSTRUCT;
DIM
FILEINFO
AS
BY_HANDLE_FILE_INFORMATION
filehandle=openfile(“aa。pdf”,lp,OF_READ)
getfileinformationbyHandle
filehandle,FILEINFO
这个FILEINFO就是你要的文件的所有属性的一个vb定义的结构,得到这个结构
你就可以得到文件所有的属性。
你还可以查阅vb
api函数的帮助,对你解决问题有帮助,祝好运!
具体如下:
一、标准共分三大类:
1石油设备设计及制造规范;
2石油设备使用及维护推荐做法;
3钻井及采油作业推荐做法。
目前,API公布了已用于API产品认证的54项产品规范。
二、API标准化政策
美国石油学会规范的出版,有利于采购标准化的材料和设备,同时也是为了制造商生产符合本会相应规范的材料或设备提供指导。这些规范不是旨在排队优良技术的需求,也不以任何方式阻碍任何人购买生产符合其它规范的产品。制定、发布API规范和API质量纲要规范,绝非旨在限制买主向未授权使用API会标的制造商购买产品。
API规范可供愿意执行规范的所有人使用。本会已做出不懈的努力,以保证其规范数据的准确性和可靠性。但是,本会对出版任何一个API规范都不表态担保和保证,并声明:凡因使用API规范而造成的损失或损坏所引起的责任和义务,API均不予以承担。
凡在自己生产的设备或材料上标有某一API规范的制造商,均有责任遵守该规范的全部条款。但API对其产品是否确实符合相应的API规范不作任何表态、担保和保证。
三、API认证介绍
1API会标API会标是美国石油学会的学会标志。该标志经美国注册登记,未经许可任何人不得使用。
2API取证API取证即通过一个申请、检查、确认程序,有API向产品技术商符合API产品规范、质量保证体系符合API质量纲要规范的制造厂授予证书,允许制造厂在其产品上使用API会标标志。API取证的实质是商标转让使用的授权活动。
3API对会标的说明
(1)只授予通过API认证的制造厂
(2)不是对制造厂的担保
(3)不是对设计的赞同
(4)不是对产品的担保
(5)制造厂保证经确认的产品,每一个都符合制造时的API规范
(6)API承认制造厂在遵守制定的API标准方面受到了API的信任
四、API认证的需求
API认证从过去的潜在需求,在加入WTO的进程中,变为了显在的需求,石油机械产品的定货中,越来越注重API产品的质量认可,是由于API在石油行业的特殊地位所决定。API在美国国内及国外都享有很高的声望,它所制定的石油化工和采油机械技术标准被许多国家采用,它是美国商业部和美国贸易委员会承认的石油机械认证机构。API的认证标志在国际上也享有很高的信誉。佩带API标志的石油机械不仅被认为是质量可靠而具有先进水平,当然,价格也较高。
企业普遍反映API认证的费用太高。确实,就算是在欧美发达国家,认证也是一笔较高的投入。从很现实的角度来看,认证的费用最终是由购买者承担,企业在认证上的投入实际上应视为是产品附加值提高的技术成本投入。
中东、南美和亚洲许多国家的石油公司在招标采购石油机械时,一般都要求佩有API标志的产品才能有资格参加投标。
API对申请认证的产品不要求强制性的实验室检测,但对涉及石油、天然气的采集、加工行业的各种设备,API提出了55种详细规范。如,6D规范涉及管线阀门,包括球阀、闸阀、止回阀等。这些规范规定了产品需满足的最低要求。虽然无强制检测,但API的观察员会检查厂家递交的产品计划书,确保厂方在生产过程中执行产品规范体系。
用API
FUNCTION ulong GetFileTime(ulong hFile,ref FILETIME lpCreationTime,ref FILETIME lpLastAccessTime,ref FILETIME lpLastWriteTime) LIBRARY "kernel32dll"
filetime是个结构
Type FILETIME from structure
Long dwLowDateTime
Long dwHighDateTime
End Type
参数表
参数 类型及说明
hFile Long,文件的句柄
lpCreationTime FILETIME,用于装载文件的创建时间
lpLastAccessTime FILETIME,用于装载文件上一次访问的时间(FAT文件系统不支持这一特性)
lpLastWriteTime FILETIME,用于装载文件上一次修改的时间
注:
如果不需要特定的信息,那么lpCreationTime,lpLastAccessTime,lpLastWriteTime都可以设置为零。这个函数返回的文件时间采用UTC格式
提供一个 VB 遍历指定文件夹下 文件的 代码
'查找第一个文件的API
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
'查找下一个文件的API
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
'获取文件属性的API
Public Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
'关闭查找文件的API
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
'以下为调用浏览文件夹窗口的API
Public Declare Sub CoTaskMemFree Lib "ole32dll" (ByVal hMem As Long)
Public Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Public Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
'常量
Public Const MAX_PATH = 260
Public Const MAXDWORD = &HFFFF
Public Const INVALID_HANDLE_VALUE = -1
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const BIF_RETURNONLYFSDIRS = 1
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
'定义类(用于查找文件)
Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String MAX_PATH
cAlternate As String 14
End Type
'定义类(用于浏览文件夹窗口)
Public Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
'自定义函数
Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
窗体代码:
Function GetAllFilePath(path As String, SearchStr As String)
Dim FileName As String ' 文件名
Dim DirName As String ' 子目录名
Dim dirNames() As String ' 目录数组
Dim nDir As Integer ' 当前路径的目录数
Dim i As Integer ' 循环计数器变量
Dim hSearch As Long ' 搜索句柄变量
Dim WFD As WIN32_FIND_DATA
Dim Cont As Integer
If Right(path, 1) <> "\" Then path = path & "\"
'搜索子目录
nDir = 0
ReDim dirNames(nDir)
Cont = True
hSearch = FindFirstFile(path & "", WFD)
If hSearch <> INVALID_HANDLE_VALUE Then
Do While Cont
DirName = StripNulls(WFDcFileName)
If (DirName <> "") And (DirName <> "") Then
If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
dirNames(nDir) = DirName
nDir = nDir + 1
ReDim Preserve dirNames(nDir)
End If
End If
Cont = FindNextFile(hSearch, WFD) '获取下一个子目录
Loop
Cont = FindClose(hSearch)
End If
' 遍历目录并累计文件总数
hSearch = FindFirstFile(path & SearchStr, WFD)
Cont = True
If hSearch <> INVALID_HANDLE_VALUE Then
While Cont
FileName = StripNulls(WFDcFileName)
If (FileName <> "") And (FileName <> "") Then
GetAllFilePath = GetAllFilePath + (WFDnFileSizeHigh MAXDWORD) + WFDnFileSizeLow
List1AddItem path & FileName
If GetFileAttributes(path & FileName) = 32 Then
List2AddItem FileName
End If
End If
Cont = FindNextFile(hSearch, WFD) ' 获取下一个文件
Wend
Cont = FindClose(hSearch)
End If
'如果子目录存在则遍历之
If nDir > 0 Then
For i = 0 To nDir - 1
GetAllFilePath = GetAllFilePath + GetAllFilePath(path & dirNames(i) & "\", _
SearchStr)
Next i
End If
End Function
Private Sub Command1_Click()
Dim SearchPath As String
Dim FindStr As String
Dim FileSize As Long
Dim iNull As Integer, lpIDList As Long, lResult As Long
Dim sPath As String, udtBI As BrowseInfo
With udtBI
'设置浏览窗口
hWndOwner = MehWnd
'返回选中的目录
ulFlags = BIF_RETURNONLYFSDIRS
End With
'调出浏览窗口
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
'获取路径
SHGetPathFromIDList lpIDList, sPath
'释放内存
CoTaskMemFree lpIDList
iNull = InStr(sPath, vbNullChar)
If iNull Then
sPath = Left$(sPath, iNull - 1)
End If
End If
ScreenMousePointer = vbHourglass
List1Clear
List2Clear
SearchPath = sPath '选中的目录为搜索的起始路径
FindStr = "" '搜索所有类型的文件(此处可另作定义)
FileSize = GetAllFilePath(SearchPath, FindStr)
ScreenMousePointer = vbDefault
End Sub
FindStr = "E:\jpg" 就可以 E盘遍历jpg文件
InStr(1, a, "123") 就可以识别 含有"123"的字符串: 返回 0 没有,非 0 有
稍微改一下就可以了
这个程序主要是实现遍历,可以找到指定文件夹下所有文件,包括子目录下,
如果只需要搜索指定文件夹下文件,不处理子目录,就可以不用这么复杂。
提供一个 VB 遍历指定文件夹下 文件的 代码
'查找第一个文件的API
Public Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
'查找下一个文件的API
Public Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
'获取文件属性的API
Public Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
'关闭查找文件的API
Public Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
'以下为调用浏览文件夹窗口的API
Public Declare Sub CoTaskMemFree Lib "ole32dll" (ByVal hMem As Long)
Public Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Public Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Public Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
'常量
Public Const MAX_PATH = 260
Public Const MAXDWORD = &HFFFF
Public Const INVALID_HANDLE_VALUE = -1
Public Const FILE_ATTRIBUTE_ARCHIVE = &H20
Public Const FILE_ATTRIBUTE_DIRECTORY = &H10
Public Const FILE_ATTRIBUTE_HIDDEN = &H2
Public Const FILE_ATTRIBUTE_NORMAL = &H80
Public Const FILE_ATTRIBUTE_READONLY = &H1
Public Const FILE_ATTRIBUTE_SYSTEM = &H4
Public Const FILE_ATTRIBUTE_TEMPORARY = &H100
Public Const BIF_RETURNONLYFSDIRS = 1
Public Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
'定义类(用于查找文件)
Public Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String MAX_PATH
cAlternate As String 14
End Type
'定义类(用于浏览文件夹窗口)
Public Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type
'自定义函数
Function StripNulls(OriginalStr As String) As String
If (InStr(OriginalStr, Chr(0)) > 0) Then
OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
End If
StripNulls = OriginalStr
End Function
窗体代码:
Function GetAllFilePath(path As String, SearchStr As String)
Dim FileName As String ' 文件名
Dim DirName As String ' 子目录名
Dim dirNames() As String ' 目录数组
Dim nDir As Integer ' 当前路径的目录数
Dim i As Integer ' 循环计数器变量
Dim hSearch As Long ' 搜索句柄变量
Dim WFD As WIN32_FIND_DATA
Dim Cont As Integer
If Right(path, 1) <> "\" Then path = path & "\"
'搜索子目录
nDir = 0
ReDim dirNames(nDir)
Cont = True
hSearch = FindFirstFile(path & "", WFD)
If hSearch <> INVALID_HANDLE_VALUE Then
Do While Cont
DirName = StripNulls(WFDcFileName)
If (DirName <> "") And (DirName <> "") Then
If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
dirNames(nDir) = DirName
nDir = nDir + 1
ReDim Preserve dirNames(nDir)
End If
End If
Cont = FindNextFile(hSearch, WFD) '获取下一个子目录
Loop
Cont = FindClose(hSearch)
End If
' 遍历目录并累计文件总数
hSearch = FindFirstFile(path & SearchStr, WFD)
Cont = True
If hSearch <> INVALID_HANDLE_VALUE Then
While Cont
FileName = StripNulls(WFDcFileName)
If (FileName <> "") And (FileName <> "") Then
GetAllFilePath = GetAllFilePath + (WFDnFileSizeHigh MAXDWORD) + WFDnFileSizeLow
List1AddItem path & FileName
If GetFileAttributes(path & FileName) = 32 Then
List2AddItem FileName
End If
End If
Cont = FindNextFile(hSearch, WFD) ' 获取下一个文件
Wend
Cont = FindClose(hSearch)
End If
'如果子目录存在则遍历之
If nDir > 0 Then
For i = 0 To nDir - 1
GetAllFilePath = GetAllFilePath + GetAllFilePath(path & dirNames(i) & "\", _
SearchStr)
Next i
End If
End Function
Private Sub Command1_Click()
Dim SearchPath As String
Dim FindStr As String
Dim FileSize As Long
Dim iNull As Integer, lpIDList As Long, lResult As Long
Dim sPath As String, udtBI As BrowseInfo
With udtBI
'设置浏览窗口
hWndOwner = MehWnd
'返回选中的目录
ulFlags = BIF_RETURNONLYFSDIRS
End With
'调出浏览窗口
lpIDList = SHBrowseForFolder(udtBI)
If lpIDList Then
sPath = String$(MAX_PATH, 0)
'获取路径
SHGetPathFromIDList lpIDList, sPath
'释放内存
CoTaskMemFree lpIDList
iNull = InStr(sPath, vbNullChar)
If iNull Then
sPath = Left$(sPath, iNull - 1)
End If
End If
ScreenMousePointer = vbHourglass
List1Clear
List2Clear
SearchPath = sPath '选中的目录为搜索的起始路径
FindStr = "" '搜索所有类型的文件(此处可另作定义)
FileSize = GetAllFilePath(SearchPath, FindStr)
ScreenMousePointer = vbDefault
End Sub
FindStr = "E:\jpg" 就可以 E盘遍历jpg文件
InStr(1, a, "123") 就可以识别 含有"123"的字符串: 返回 0 没有,非 0 有
稍微改一下就可以了
这个程序主要是实现遍历,可以找到指定文件夹下所有文件,包括子目录下,
如果只需要搜索指定文件夹下文件,不处理子目录,就可以不用这么复杂。
嘟嘟广州社区为你解答
使用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 copy
);
显然,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)被赋值给sabInheritHandle。
(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
statusdump(afxDump);
#endif
以上就是关于用vb如何得到一个pdf文档属性全部的内容,包括:用vb如何得到一个pdf文档属性、api是什么标准、PB7中,如何读取某个文件的属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)