用vb如何得到一个pdf文档属性

用vb如何得到一个pdf文档属性,第1张

你的问题可以这样解决:

首先你要使用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中,如何读取某个文件的属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9622334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存