|
文件操作 API 函数介绍
' ~# j4 `8 C7 b* g4 ]8 s3 o$ D! C2 n( i/ S E$ x1 J" W1 c. y2 Y, f+ X
! w: u0 M/ v/ w
作者:zhanglc
9 p2 ?* L& t& ]# M
! f9 {/ U6 p+ j4 e& ?# V3 U8 ]
! X& b& ?+ j5 b* I0 v& i0 ` 在VC中,大多数情况对文件的操作都使用系统提供的 API 函数,但有的函数我们不是很熟悉,以下提供一些文件操作 API 函数介绍:
4 l7 [6 v* t7 V% ~
. N2 I8 x! [ M5 k9 f5 Z 一般文件操作 API
7 e2 J5 o# N s$ V
E Y# S- J9 H# i; W8 \CreateFile
3 t; O$ R& S/ p5 q6 Q3 E打开文件% I; p" {6 h" y8 a
要对文件进行读写等操作,首先必须获得文件句柄,通过该函数可以获得文件句柄,该函数是通向文件世界的大门。
& C6 B, q! t1 y# R# @) T1 V; ?5 ]: G' n' ]" a& f# f+ U" p% I
ReadFile
$ y* J$ e1 Q @从文件中读取字节信息。 7 B* ]+ t+ Q6 S4 ~
在打开文件获得了文件句柄之后,则可以通过该函数读取数据。6 y N8 f* v% i5 ]1 p
3 Z, E) L6 N) i+ tWriteFile
- V n7 ?& z& U& Q向文件写入字节信息。
) q; X2 c, b$ J- ~% I同样可以将文件句柄传给该函数,从而实现对文件数据的写入。 \3 W' e4 F8 Q& l
/ `, q8 R. Y$ n l
CloseHandle
, o- t; o1 E- v. U, P7 ?- l关闭文件句柄。
3 L) n2 m( e# m' J/ P( R6 i: A打开门之后,自然要记得关上。" Z' ] i. i! k1 J4 ^
5 K, O0 J, f# [8 Y, U) y$ l' c
GetFileTime
: ?. w* r3 x9 I6 K# O9 }0 t$ S获取文件时间。 ( ?& C. W3 Y4 [# Z
有三个文件时间可供获取:创建时间、最后访问时间、最后写时间。
3 Y# L! B' C! P3 g该函数同样需要文件句柄作为入口参数。& \ P9 u, b2 e: c( R
( `+ I6 f4 c6 @) B! r$ u/ q0 d
GetFileSize
# \5 d; _9 H" c获取文件大小。
1 a, v& a3 L) _( Q4 F由于文件大小可以高达上数G(1G需要30位),因此一个32位的双字节类型无法对其精确表达,因此返回码表示低32位,还有一个出口参数可以传出高32位。 % E; R* |) j- J0 t
该函数同样需要文件句柄作为入口参数。& E' R' A! M2 V4 {/ ?! G
: i Q, v( O. x! TGetFileAttributes
9 G+ q% g# C9 V( k: c" B2 F- n% a4 L获取文件属性。 & U7 h7 z6 J8 y- r/ x1 E" j' z
可以获取文件的存档、只读、系统、隐藏等属性。
) I z) Q0 |* F% j1 }5 h: E该函数只需一个文件路径作为参数。
# x' b" j$ j2 Z5 j
t4 k" N( j+ oSetFileAttributes
/ e5 U9 R" Q1 z7 J设置文件属性。 1 q6 G6 p# i+ z) l' y7 s6 W' S, R
能获取,自然也应该能设置。 , Z8 Y# y" W$ h
可以设置文件的存档、只读、系统、隐藏等属性。 ' B Z" r2 b4 @6 [9 }- }
该函数只需一个文件路径作为参数。8 L6 ]; y* u* k+ k5 {8 L3 ?
1 v' D$ |1 ?& G' U; s2 \: r$ q
GetFileInformationByHandle
! p9 p2 J5 O3 P: E6 V" Q7 q0 h获取所有文件信息 $ b1 W, |! S; y% h6 i( I" p
该函数能够获取上面所有函数所能够获取的信息,如大小、属性等,同时还包括一些其他地方无法获取的信息,比如:文件卷标、索引和链接信息。
( a# |7 P8 M* v, C' }+ x该函数需要文件句柄作为入口参数。2 n7 ?; a. \/ W( m0 }9 C9 I
/ j2 a5 C1 B/ @
GetFullPathName 4 q4 H( B' |' O# X, Y, ]) r) `* i
获取文件路径,该函数获取文件的完整路径名。
: D. ?. b" \$ ~) s, d需要提醒的是:只有当该文件在当前目录下,结果才正确。如果要得到真正的路径。应该用GetModuleFileName函数。: G; Y0 x& y! @& m" R* Q& _
9 S X& m' a* L0 E( [5 r5 B
CopyFile
9 O+ N( Z, y- Y. M1 v& t' z复制文件
& Q, }5 J7 d: O/ o) h7 _注意:只能复制文件,而不能复制目录
' E) K ^5 q6 O7 }3 m- o! Q
2 p9 k. p6 Z8 n/ Q3 nMoveFileEx
+ L7 Z, @0 ]" Q7 Z, a) \" w9 l+ ^/ p移动文件
; x) q; Q/ T* L2 x) T" y既可以移动文件,也可以移动目录,但不能跨越盘符。(Window2000下设置移动标志可以实现跨越盘符操作)
! J, q- w) o' [( |; X5 v! E" f1 h3 V0 q- k
DeleteFile . w/ X0 Q3 u$ _: ]% j. J5 ]
删除文件3 Z& `/ d1 z- c9 i- ?4 H; K
* w! V% C" a5 ^' I
GetTempPath
" H1 i! ?% O& A/ B$ _8 ^7 D获取Windows临时目录路径
" b* L( J7 \3 I7 C2 n0 x- S% V
# P7 }' x1 q- F& |6 pGetTempFileName
5 z0 L" ` a1 t( ?; [- C9 U在Windows临时目录路径下创建一个唯一的临时文件
# Q" {; u, F- q! L/ a2 r$ c* }. C3 @: u' G. a/ Q* s
SetFilePoint
, [% a: p1 S( U1 k) f' d/ s+ p5 S移动文件指针。
; u* a: S$ u/ k2 T该函数用于对文件进行高级读写操作时。
" F2 e5 B/ E1 L9 W& { y6 q8 {( r" n
8 J7 s( C) Q# _2 q% ?* s
+ P: x6 A4 G. L# h 文件的锁定和解锁/ y, P V& z/ i5 ~; ?) F# T8 U! |8 ]
) J* P1 l4 H2 M3 M% T& JLockFile 3 |" R* @7 b# K5 D" V8 y
UnlockFile 6 `2 G, O! l( e
LockFileEx
+ J8 y2 z8 N7 F- k, xUnlockFileEx
* Q; E' j4 Q* [. x+ |# p- R" d1 H- J& N% a. j* s( x0 o3 N
以上四个函数用于对文件进行锁定和解锁。这样可以实现文件的异步操作。可同时对文件的不同部分进行各自的操作。
3 s) K+ l& l- E5 Y/ R- ]$ w4 f
9 C9 R& a$ F2 e( l c, ~; I' r 文件的压缩和解压缩! @% s0 m4 y$ i! M( e
3 f# Y# d2 A( A7 \# @' h3 b8 y
LZOpenFile
! O1 x6 I! u8 z M1 r打开压缩文件以读取
& g$ Z; t4 j6 L5 {
1 r9 I% H7 @, l$ pLZSeek + d0 c4 i5 a) g( z
查找压缩文件中的一个位置
4 Y4 S, t( ~, y, \
/ l8 o' e: H/ X+ R* [6 v5 v9 {3 TLZRead
' `1 b4 a; a& i读一个压缩文件% U7 m5 g7 `) u& F
3 W5 W6 M4 R! n# T! H) v1 D4 W
LZClose
: A. ?# P5 A: Z6 Q/ s! A, z关闭一个压缩文件
, f( O7 h) Y6 M3 _: m+ |8 z$ E4 ]' _+ ?8 k
LZCopy ; x) |$ j1 c8 p! v' \) O; b, V
复制压缩文件并在处理过程中展开+ b1 ^% k4 G7 @% o) q* p
6 B f: {! w, z! ^( g
GetExpandedName ) }( U. o' B2 S' v, Y: Y
从压缩文件中返回文件名称。& I m9 n+ N8 I2 g
0 X7 ~: J8 W! Y" L以上六个函数为32位 API 中的一个小扩展库,文件压缩扩展库中的函数。文件压缩可以用命令 compress 创建。
/ e! n$ L, i$ q5 Y0 [1 [& R( v" B- V7 h* @. ^& G( P5 E/ \
8 Y1 D8 o, L3 E: ?
文件内核对象3 o* D0 P+ z6 d; H
0 W/ H v. B$ X) t& C. x& A0 p& L
32位 API 提供一个称为文件映像的特性,它允许将文件直接映射为一个应用的虚拟内存空间,这一技术可用于简化和加速文件访问。( n L& \; ~5 b1 r6 y3 R
$ h$ [& ^" ]7 a$ d% ~' I( VCreateFileMapping
/ f& n4 L$ p# o) ^- d% E7 \; E, g创建和命名映射4 e$ b# t9 C7 G( P8 a; @" R5 R
9 k% u4 l% S2 h) I) h- {
MapViewOfFile
0 e6 r; s. D, O; \3 j1 ?" b# G把文件映射装载如内存
4 L* Y( R5 ?( t) d T8 D
" l: o! ]# ]0 q2 o& kUnmapViewOfFile . ?9 W5 A* U) W! v4 v3 x' T% s/ w
释放视图并把变化写回文件
& P" I% l0 Q. Y5 S5 X9 a) `
1 s# Z" R) ?* P% @! C3 W4 @, GFlushViewOfFile # l. w, L" ^- d, T# H# g
将视图的变化刷新写入磁盘7 S. N+ ^ z+ h: M% T5 t' Y& {9 }
# `+ M$ x( U" w# t9 X; l希望通过以上几个常用的 API 函数,能快速的提高文件操作过程函数的编写。 |
|