|
|
文件操作 API 函数介绍
! G E" O, V- u# P4 B1 \9 k, }) s' B, y# U: I; |- ~- f
1 X. ^$ S5 P/ @1 ~ x
作者:zhanglc9 h/ N; N/ F: B! A ^) x
6 n; {( j' n2 q! \9 l7 Q0 S( y# w
9 D# L% F( e u
在VC中,大多数情况对文件的操作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件操作 API 函数介绍:
% U% l& n& S( r1 N' H6 p8 q2 I$ `: I
一般文件操作 API
/ t/ S2 Y H% I) {. ?4 y3 P7 v' @* v" w
CreateFile
$ i- L8 N1 @! J3 O打开文件: z( j4 T8 n( W4 M3 x' \; p! m% {6 p5 F
要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。5 d b! A7 o& {1 k V$ K9 g- q
) O' `; B) ?. B9 wReadFile
# I/ E8 A; O3 ~" K, ?6 J5 v# o8 n从文件中读取字节信息。
+ [2 W' y9 O( t. Y4 W在打开文件获得了文件句柄之后,则可以通过该函数读取数据。
) ?' n# `6 I1 L) e$ ]. S2 A" b) h/ Z" a# j; V) o" X8 I k3 f) G
WriteFile
9 J8 x+ l/ d' I7 O' m) Q/ j向文件写入字节信息。
+ w8 n: q4 B. V* N! T+ ]" c, M5 r同样可以将文件句柄传给该函数,从而实现对文件数据的写入。
6 @" z$ Y# `- I! H
! f1 l. n z I# PCloseHandle 3 a: i% L3 m1 l& N) I& `
关闭文件句柄。 / Y* e( U" G) Q9 H& [
打开门之后,自然要记得关上。% k6 v. M/ T. B" N o2 m
; \# P# M+ U* P' A( C
GetFileTime
& m `- R2 _9 m5 D获取文件时间。
& m* P$ H0 v: H4 M) B& I有三个文件时间可供获取:创建时间、最后访问时间、最后写时间。
- y: n2 m* o. P0 J' a0 J; l) F该函数同样需要文件句柄作为入口参数。1 N! `) @) ~( l
0 o6 [" A. |* P" Q, vGetFileSize
. B5 T" W" t3 s9 r获取文件大小。 9 m: {' [5 W" }! k2 b4 `2 ?
由于文件大小可以高达上数G(1G需要30位),因此一个32位的双字节类型无法对其精确表达,因此返回码表示低32位,还有一个出口参数可以传出高32位。 8 ?+ `: K8 D% e8 E# |
该函数同样需要文件句柄作为入口参数。
}& R' P* I: Z3 \# B
6 q# w" y* @5 n6 ~- Q/ {GetFileAttributes " K- I4 W+ y' v7 S1 f
获取文件属性。
0 c1 k2 U3 i- K# s$ K9 c4 K可以获取文件的存档、只读、系统、隐藏等属性。 # a1 J7 g$ M& _2 F
该函数只需一个文件路径作为参数。
* N( W- Y/ d9 E
, ~: O, G$ R3 M9 i, QSetFileAttributes
6 y/ n8 y8 P/ A2 q# }2 W设置文件属性。 ; g9 l7 A; m6 H% w3 x
能获取,自然也应该能设置。 / I* `/ I' B3 S( w/ j
可以设置文件的存档、只读、系统、隐藏等属性。
2 V; L0 R! ~# f, [" n$ i& t该函数只需一个文件路径作为参数。
$ Z8 F: t1 ?' [/ i( S# \5 S
' q7 ~% S7 r8 D' T' J2 sGetFileInformationByHandle ; }' {3 [- S( t5 b+ V
获取所有文件信息
8 P- Y5 P9 [: M3 z1 c3 i该函数能够获取上面所有函数所能够获取的信息,如大小、属性等,同时还包括一些其他地方无法获取的信息,比如:文件卷标、索引和链接信息。 / u) N' e- \9 n
该函数需要文件句柄作为入口参数。
: _! Z8 O- ]; f0 T0 j" g8 k7 y1 `" ]* E
GetFullPathName + {* M8 `7 a% H
获取文件路径,该函数获取文件的完整路径名。
# ]4 q+ M3 X3 q/ z! N6 g需要提醒的是:只有当该文件在当前目录下,结果才正确。如果要得到真正的路径。应该用GetModuleFileName函数。; y" B) j6 z0 h3 Y/ v8 s0 y
& q0 c3 m- m' h' ~% t
CopyFile
' A0 w; C. w0 M/ A+ D复制文件 8 p( U2 v3 I$ h+ B* X1 o: @' b
注意:只能复制文件,而不能复制目录
! N# _) u' o3 D7 o/ F
/ W' j2 H1 S& ]* U0 a4 U! N5 YMoveFileEx
$ u! z/ A. n, h9 }移动文件
2 M e% V ^2 ?. z9 V既可以移动文件,也可以移动目录,但不能跨越盘符。(Window2000下设置移动标志可以实现跨越盘符操作): J# R' D4 M9 c4 _' Z: c' U2 F5 z/ z
' ^; ~- t8 \# U, |, o7 B
DeleteFile
\* U7 U% L, @& j删除文件
Q; p9 x7 N" |* \: f; c6 J! A0 _8 U
GetTempPath
2 n5 ~+ t( @ v获取Windows临时目录路径
8 T$ \1 e, z' X: W5 B6 M+ t
% T* f: q7 K# ^. s5 Z! s3 @3 ^GetTempFileName # t; L. ^3 V0 c0 ]7 m' M
在Windows临时目录路径下创建一个唯一的临时文件; p$ Z* O$ r4 d2 K7 C; [
# F/ w0 L* i3 t3 J' l3 n. F2 k
SetFilePoint 4 o4 c. ^% q! F. A/ [
移动文件指针。
; U0 x! x; `3 C9 M该函数用于对文件进行高级读写操作时。0 y# b& L- u6 R) }1 p
1 |/ L# Z8 J) |
2 t6 X4 ~+ ~( Z: E2 g p
文件的锁定和解锁
. K- T& |6 U1 B# d9 J5 a7 T1 H
`: F p5 Y/ }" D. b& u: OLockFile " p, E9 _8 B7 _4 C8 Z
UnlockFile 0 X2 U* P: j* I) @/ u( a
LockFileEx , m0 ?0 A( p5 P# F' ~
UnlockFileEx
, h- Z7 h5 C- _: W/ W4 C4 q3 Z Z. k3 _
以上四个函数用于对文件进行锁定和解锁。这样可以实现文件的异步操作。可同时对文件的不同部分进行各自的操作。
$ l+ Q- s% L7 @+ Q N- e
$ h# _# N5 }; b/ p' u 文件的压缩和解压缩
2 w# f* d ^. _5 `: ]
) b8 _9 r- q3 I5 a$ `2 C# ]LZOpenFile 6 K, B# F: H" c- k; O& r! j2 |
打开压缩文件以读取2 |; G6 T9 D7 g$ N0 p( p' o
' i) L$ w( n* h9 ?8 Y. k/ h5 {
LZSeek " Z9 U9 O; R; W7 R8 G" f
查找压缩文件中的一个位置
( l1 a9 ?9 R( ]
# N/ _' T$ Y' S/ A* `LZRead # l! h; a2 P5 d; s, ]( L% L: _; j! o
读一个压缩文件
# R2 y6 U: T# L2 Q) B- [; b2 ]* v9 n* Y$ I1 q
LZClose 0 P* s6 U/ [: Q- Z* g
关闭一个压缩文件
2 b, L8 {0 _' H H0 T7 w3 R& T' f ^( Q& y
LZCopy
. X- t L! D7 t/ Z V( X5 H复制压缩文件并在处理过程中展开 t) o5 m! z2 p, A0 w0 @
0 c2 @6 y- l" {* d9 W; q5 `
GetExpandedName 8 j! C+ { K- ~
从压缩文件中返回文件名称。
# N; M" w* ?5 l: C$ Q K2 F% }0 K* B2 ~+ f- D2 R) B' j& a4 x
以上六个函数为32位 API 中的一个小扩展库,文件压缩扩展库中的函数。文件压缩可以用命令 compress 创建。2 C0 T- x. s) y. G( E1 ^2 }
; K$ ~3 J! U) {- |9 J
8 a+ n7 g. n& r! L& V5 A 文件内核对象2 C( E$ X5 V/ T: Y3 l
" b2 ^; f3 V3 |' k5 U3 E
32位 API 提供一个称为文件映像的特性,它允许将文件直接映射为一个应用的虚拟内存空间,这一技术可用于简化和加速文件访问。
0 c# O1 W. Y7 m% I0 I; J, V3 ?+ V) _" H$ a4 ]; y, o9 Z; O
CreateFileMapping 5 s$ W- d4 w9 U4 I5 B) f2 V
创建和命名映射" }4 z+ j, q8 r3 M0 {. y3 J8 O$ I
+ }* M" ?$ ?& |0 T2 cMapViewOfFile
; b% u& J. K* S$ ?/ K把文件映射装载如内存. k$ S6 B) {9 m7 k0 F- c G
( F. b; u( y) s$ Z6 H2 S1 XUnmapViewOfFile
4 D1 r5 E* Z7 |# W/ P R$ k释放视图并把变化写回文件 h; _5 i2 j( R* C7 e( P- E. q$ ^ B7 A7 O
: v) S" _! U' W. G; T- GFlushViewOfFile
6 Y; P6 Z0 ^( Y+ N1 x6 m将视图的变化刷新写入磁盘# Y7 u+ @9 ~4 {" J: v, K. B
/ P7 y- Q% E8 `% v0 B希望通过以上几个常用的 API 函数,能快速的提高文件操作过程函数的编写。 |
|