如果 要对 任何文件 进行操作,都要 先 创建 一个NSFileManager类型的物件,也就是 文件管理器物件,并且 对 其 采取 适用于这类物件的措施。要创建 NSFileManager类型的物件,需要 向NSFileManager这类物件 发送 defaultManager这条消息,就像 这样:
1
2
|
NSFileManager
*myFileManager
;
myFileManager
=
[
NSFileManager
defaultManager
]
;
|
这里 创建了 一个NSFileManager类型的物件,叫做 myFileManager。如果 要 从当前目录 删除 一个叫todolist的文件,那么 就要对 myFileManager这个物件 采取 removeFileAtPath:handler:这项措施:
1
|
[
myFileManager
removeFileAtPath
:
@"todolist"
handler
:
nil
]
|
你 可以检查removeFileAtPath:handler:这项措施所产生的结果 以确保 操作的成功:
1
2
3
4
5
6
7
8
9
|
if
(
[
myFileManager
removeFileAtPath
:
@"todolist"
handler
:
nil
]
==
NO
)
{
NSLog
(
@"文件删除失败!"
)
;
return
6
;
}
|
如果 removeFileAtPath:handler:这项措施产生的结果 为 NO,则 显示出 相应的信息 以表示 操作失败。
进行 文件操作时,通过包含文件属性的辞典物件 你 可以设定 你所创建的文件的权限 或者 获取、改变 文件的信息。fileAttributesAtPath:traverseLink:这项措施 会将 文件属性 以辞典物件的形式 传递给 你。
下面的程序 示范了 一些基本的文件操作。在运行 这个程序之前,我 在可执行文件所在的目录 已经创建了 一个叫myFile的文本文件,这个文件 包含了 一行文本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
#import <Foundation/NSObject.h>
#import <Foundation/NSString.h>
#import <Foundation/NSFileManager.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSDictionary.h>
int
main
(
int
argc
,
const
char
*argv
[
]
)
{
NSAutoreleasePool
*pool
=
[
[
NSAutoreleasePool
alloc
]
init
]
;
NSString
*fileName
=
@"myFile"
;
NSFileManager
*myFileManager
;
NSDictionary
*attributes
;
//创建NSFileManager类型的物件,也就是文件管理器物件
myFileManager
=
[
NSFileManager
defaultManager
]
;
//检查文件myFile是否存在
if
(
[
myFileManager
fileExistsAtPath
:
fileName
]
==
NO
)
{
NSLog
(
@"文件myFile不存在"
)
;
return
1
;
}
//复制文件myFile
if
(
[
myFileManager
copyPath
:
fileName
toPath
:
@"myAnotherFile"
handler
:
nil
]
==
NO
)
{
NSLog
(
@"文件复制失败"
)
;
return
2
;
}
//检查文件myFile和myAnotherFile内容是否一致
if
(
[
myFileManager
contentsEqualAtPath
:
fileName
andPath
:
@"myAnotherFile"
]
==
NO
)
{
NSLog
(
@"文件内容不一致!"
)
;
return
3
;
}
//将文件myAnotherFile命名为myThirdFile
if
(
[
myFileManager
movePath
:
@"myAnotherFile"
toPath
:
@"myThirdFile"
handler
:
nil
]
==
NO
)
{
NSLog
(
@"重命名失败!"
)
;
return
4
;
}
//获取文件myThirdFile的长度
if
(
(
attributes
=
[
myFileManager
fileAttributesAtPath
:
@"myThirdFile"
traverseLink
:
NO
]
)
==
nil
)
{
NSLog
(
@"无法获取文件属性!"
)
;
return
5
;
}
else
{
NSLog
(
@"文件长度为%i字节。"
,
[
[
attributes
objectForKey
:
NSFileSize
]
intValue
]
)
;
}
//将原始文件myFile删除
if
(
[
myFileManager
removeFileAtPath
:
fileName
handler
:
nil
]
==
NO
)
{
NSLog
(
@"文件删除失败!"
)
;
return
6
;
}
//如果这行语句得以执行,则标志着之前的语句都执行成功
NSLog
(
@"所有操作都成功完成!"
)
;
//将文件myThirdFile的内容显示出来
NSLog
(
@"文件的内容:%@"
,
[
NSString
stringWithContentsOfFile
:
@"myThirdFile"
encoding
:
NSUTF8StringEncoding
error
:
nil
]
)
;
[
pool
drain
]
;
return
0
;
}
|
运行 这个程序,可以得到 这样的结果:
1
2
3
4
|
2012-05-08 13:34:16.009 Sample[1470:707] 文件长度为18字节。
2012-05-08 13:34:16.010 Sample[1470:707] 所有操作都成功完成!
2012-05-08 13:34:16.011 Sample[1470:707] 文件的内容:编程很有趣!
Program ended with exit code: 0
|
这个程序 首先 检查了 myFile这个文件 是否存在。如果 myFile这个文件 存在,则将 myFile这个文件 复制 一份,并且 命名为 myAnotherFile。然后 再 检查 文件myFile 和 文件myAnotherFile的内容 是否一致。有经验的UNIX用户 应该会注意到 在采取 copyPath:toPath: 或者 movePath:toPath:这样的措施时,你 不能只说明 目标目录,而 要 精确地 说明 目标文件的名称。
movePath:toPath:这项措施 可以将 文件 从一个目录 移动 到另外一个目录,也可以移动 整个目录。如果 这项措施的两个参数所指的文件 位于 同一个目录,那么 这项措施的作用 就是 为这个文件 重新 命名。
在进行 复制、重命名、移动操作时,目标文件 不能是 已经存在的文件。如果 目标文件 已经存在,那么 操作 就会失败。
在这个程序中 我 对 myFileManager这个物件 采取了 fileAttributesAtPath:traverseLink:这项措施,fileAttributesAtPath:traverseLink:这项措施 会将 其参数中的文件的属性 以辞典的形式 存储 在变量attributes当中。在attributes这个辞典物件当中,文件长度所对应的关键字 是 NSFileSize。所以 只要对 attributes这个辞典物件 采取 objectForKey:这项措施,并且 用 NSFileSize 充当 参数,就可以读取出 文件的长度。最后 还要采取 intValue这项措施 将 文件的长度 转换成 整数类型。
然后 我 对 myFileManager这个物件 采取了 removeFileAtPath:handler:这项措施 将 原始文件myFile 删除。
最后 我 向NSString这类物件 发送了 stringWithContentsOfFile:这条消息。NSString这类物件 会利用 stringWithContentsFile:这条消息中参数所指定的文件中的内容 创建 一个NSString类型的字符串物件。
在这个程序当中 如果 有 任何一项操作 失败,那么 return语句 就会得以执行,从而 中止 程序,并且 将 相应的非零的整数值 显示 在终端上。根据惯例,非零的整数值 用来代表 程序错误。不同的值 用来代表 不同类型的错误。