![iOS开发:从零基础到精通](https://wfqqreader-1252317822.image.myqcloud.com/cover/796/26793796/b_26793796.jpg)
4.7 NSFileManager类
4.7.1 文件操作
基于NSFileManager类,允许用户对文件进行基本操作。这些操作包括:创建新的文件、读取文件、对文件进行复制、移动以及删除等,同时还可以对文件的一些常规属性进行读取以及修改。
1.基本概念
在学习NSFileManager类的相关属性和方法之前,需要提前了解并掌握如下几个与文件相关的基本概念。
- 路径Path:在使用NSFileManager类对文件进行操作时,经常需要使用到路径的概念,路径可以理解为文件的物理存储路径+文件名称的组合,每个路径名都是一个NSString类型的对象。
- 属性Attr:文件的属性是一个NSDictionary类型的对象,文件属性定义在Foundation/NSFileManager.h文件中,有二十余个。
- 错误err:一个指向NSError对象的指针,能提供有关文件操作更多的错误信息,如果err被置为nil,那么就会采取默认的错误处理行为。
2.基本操作
在使用NSFileManager类时,需要实例化一个NSFileManager类的对象,然后对指定路径Path上的文件进行一些操作。下方的代码演示了如何获取目录,如何获取路径(这里要注意区分路径和目录的区别),如何实例化NSFileManager类,以及如何判断一个文件是否存在。
- 首先在计算机的桌面上创建一个myfile.txt文件,可以打开终端,执行如下命令:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T112_13608.jpg?sign=1738912679-ymPICgUg7CTzf5RrktOR8hFKVImMbsHN-0-42917793e26caaf3c292a01f71c37d11)
- 文件准备完成后,在main()函数中添加下方的代码。需要注意的是:文件的路径可以通过两种方式来获取,第一种是直接给出绝对路径;另外一种是通过NSSearchPathForDirectoriesInDomains()函数来获取。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T112_82838.jpg?sign=1738912679-L6PkEb3deVKQTUfrBa6Dxty8smRHqYxo-0-fd057a63f7c278abb52ce649eb52e1be)
运行结果如图4-24所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P113_13733.jpg?sign=1738912679-eNjLdYQ0PdZeFxIlwsmK4EJMNPCXNznF-0-3f68dd766d41f9574f100a29bd210ca1)
图4-24 运行结果
3.文件的复制、移动、重命名与删除
在开发过程中,涉及对文件进行复制、移动、重命名以及删除等操作,在NSFileManager类中也提供了对应的方法。
- 复制文件。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T113_13737.jpg?sign=1738912679-P1I6QeTEc1lEwndtfQd9pP2u1GWO3gED-0-8adb57a2454f154ac8aa5ef66d6ed06f)
- 移动文件。该方法除了移动文件外,还可以用于文件改名。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T113_13739.jpg?sign=1738912679-M8GdM2XjVpYHyv5Nk6mBgqQnJpAJJgw8-0-c570f3c71711b34280b0f4cb8f58a192)
- 删除文件。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T113_13741.jpg?sign=1738912679-pNkAYBcjOWaRrVF6mi94lUCa7c2rOsHH-0-f2040475082fc8d830462cfca56a0617)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T113_13743.jpg?sign=1738912679-VSEeoPE53GexPOEHXgWela999o6vo4XC-0-8b0e2836950bbf6de53d03ae00efc6a1)
运行结果如图4-25所示。可以看到myfile.txt文件被成功地复制、移动、重命名以及删除。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P114_13903.jpg?sign=1738912679-bsW9UOPdb1Kbo48nezx2jFNjzTzFhb4o-0-37491d0bc1fab73aca91e8a4c965707d)
图4-25 运行结果
4.获取与修改文件属性
每个文件都有一些其自身属性,例如:文件大小、文件类型、文件所有者等,可以使用NSFileManager来读取以及修改指定路径上文件的属性。
- 获取文件属性:可以使用attributesOfItemAtPath:方法来获取文件的属性,返回值是一个字典,其中存储了该目标文件的属性。下面的代码中,通过attributesOfItemAtPath:方法获取了一个文件的所有属性,并且打印了文件的NSFileOwnerAccountName以及NSFileCreationDate两个属性。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T114_13907.jpg?sign=1738912679-FGMTEI0bM3YIYOvd7rn7Mzt9dTb4l7Gj-0-e9fa91d220c132bf315474b61a9d3380)
运行结果如图4-26所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P115_14059.jpg?sign=1738912679-HccfDnOBnlzcOiPFinMzhxMJhamJuHdu-0-cb97017a9c8fdffc381f77015b68a8fe)
图4-26 运行结果
文件的属性列表可以在Foundation/NSFileManager.h文件中查询,常用的一些属性如下所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T115_14063.jpg?sign=1738912679-uiJSh0NlYoN1iqZOe1dp7z7nEJFUyhim-0-e6f67170b3deb054ea69b943fe7d0cae)
- 更改文件属性:使用setAttributes:ofItemAtPath:error:方法来设置文件属性,在调用该方法之前,需要把希望改变的属性封装在一个字典中。如下所示,下方的代码更改了文件的创建时间NSFileCreationDate:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T115_14065.jpg?sign=1738912679-Beu45e0J2ALl8F5wrJ8895H27h9bNaSJ-0-bf3d1c8e2959dbf30b5ac4a04070261b)
运行结果如图4-27所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P116_14193.jpg?sign=1738912679-VC0z9A8w9bkz5U3FahbJ4xyEJbMI4JJM-0-ebb597f53f927cf9e6e224e73381be8e)
图4-27 运行结果
4.7.2 目录操作
NSFileManager类也提供了用于处理目录的一些方法,这些方法与处理普通文件的方法类似。
1.获取与变更当前目录
与在操作系统中对文件操作类似,用户经常需要获取当前所在的目录,并且可以通过前进/后退等操作来改变当前的操作目录。在NSFileManager类中也提供了获取与变更当前目录的方法。
- 获取当前目录。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T116_14198.jpg?sign=1738912679-i21wNWtwfi81aU5DmCtbaKcQeEwA7x7e-0-a2211021a15442db5723e38e8f125738)
- 变更当前目录。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T116_14200.jpg?sign=1738912679-5k3j6aZWERXM32mVdRfIXaWCzw4Avj4m-0-7309810174f47da938fbfabc7064bc56)
下方的示例代码中,演示了如何获取当前目录以及对当前目录进行修改变更。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T116_14202.jpg?sign=1738912679-Y9SkeAtHPXWnPSIRD49QrzDWrmoitwSy-0-3c711e1eb335ba6aa2db1652a31aa60a)
运行结果如图4-28所示。可以发现在初始状态时,当前操作的默认目录指向程序的调试目录。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P117_14313.jpg?sign=1738912679-hcnfU0JCqt28Zf3cTonJtgBJAjO0ZNtC-0-f3f38d80dcbc0f6a6d2ad036b72b7de4)
图4-28 运行结果
2.目录的创建、重命名与删除
与创建文件类似,目录也可以进行创建,同时可以对目录进行移动、重命名以及删除,在NSFileManager类中也提供了对应的方法。
- 创建目录。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T117_14317.jpg?sign=1738912679-DwTg79GiHCvDmIZ2nbOYvWhzBu4Ct7qo-0-5c4b19c56e71d1c74ce4358f8f09c0b3)
- 重命名/移动目录。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T117_14319.jpg?sign=1738912679-woL27KtXJ4tFd0UMi3fC2qoG1UAo6aNy-0-1e07b66b3d005a192c513ee7af33a8a6)
- 删除目录。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T117_14321.jpg?sign=1738912679-1fD8hWvbEMQW9wVLMaK715juWaUrUWAw-0-ad80446dbe43dc2a2109601d4ba077a1)
下方的示例代码展示了对一个目录进行创建、重命名以及删除三个操作。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T117_14323.jpg?sign=1738912679-W6qSVEVYkfvjvpqlj6r6xA5PqL7Z7wiX-0-1232652f0852a91e0f97139dab5771a1)
运行结果如图4-29所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P118_14436.jpg?sign=1738912679-9BlakL4Zgv1B2ELj6TxW70uO6glvblER-0-8c50c613ecc3e5ae34e158e37df9be10)
图4-29 运行结果
4.7.3 枚举目录中的内容
查看某个文件夹中的文件列表,在文件操作中是被高频使用的,在DOS中可以使用DIR命令,在Linux中可以使用ls命令,在iOS开发中,可以使用enumeratorAtPath:方法以及contentsOfDirectoryAtPath:方法,这两个方法都可以完成对指定目录的文件列表枚举,但使用中稍有差别。
1.enumeratorAtPath:方法
当使用enumeratorAtPath:方法时,一次可以枚举指定目录中的所有文件,包括子目录中的文件。该方法的返回值类型为一个NSDirectoryEnumerator类型的对象,可以使用nextObject方法来取出其中的值。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T118_14441.jpg?sign=1738912679-ruzsrkrbc43OGRDstD4bS28GtU2BEXNb-0-4a049fccc06323caa0f141ff715b257c)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T118_82841.jpg?sign=1738912679-UV6biJx7BM6m7odUlRBdC680fTWpK4nh-0-38439259d4bc71cf2ff18c3354e70251)
运行结果如图4-30所示,可以看到子目录中的文件也被列举出来了。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P119_14576.jpg?sign=1738912679-H6Dni3enXafYW8JU3YcNBzJCubYDRXmu-0-79b1da03fa722a345a7bbf535b526168)
图4-30 运行结果
2.contentsOfDirectoryAtPath:方法
当使用contentsOfDirectoryAtPath:方法时,也可以列出当前目录中的文件和文件夹名称,但子文件夹中的内容并不显示。该方法的返回值是一个NSArray类型的数组,因此可以使用forin循环来遍历其中的对象。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T119_14580.jpg?sign=1738912679-FA5CRWlM16IgmGP5BIn199GzwQN6uq5F-0-4b433dd70a5d441af003bbba3f236d5c)
示例:
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T119_14582.jpg?sign=1738912679-eZ9svi7EsPDvIdruUC9ye4FTm2BqCuS1-0-b41569d32f1097fc88a0e52f067b5f10)
运行结果如图4–31所示,对比上面使用enumeratorAtPath:方法的代码,可以看到子目录中的文件并不显示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P120_14642.jpg?sign=1738912679-gV3FI7yOeO8uz5iZZQAB3VOW89cbBq13-0-723b213a5cc2547302463e084eacf9e4)
图4-31 运行结果
4.7.4 文件的读取与写入
当对文件进行操作时,有时需要读取文件的内容,然后把文件的内容放到内存中的一块缓冲区以供后续使用。另外,有时还需要把数据缓冲区中的内容写入文件中进行保存。这两种操作就涉及文件的读取以及写入操作。文件的读取以及写入,除了使用NSFileManager类之外,还需要使用NSData类所提供的缓冲区。
1.文件内容的读取
在NSFileManager类中,提供了contentsAtPath:方法,可以读取指定目录中的文件,同时返回值是一个NSData类型的对象。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T120_14647.jpg?sign=1738912679-SRWnCsALEzFbftoI9yDYV0ebk0oI0byB-0-d84fa6618e8a318a5f6b1fac78d6e502)
2.数据写入文件
对于已经保存在缓冲区中的NSData对象,可以写入文件。常用的有两种方法,既可以使用NSFileManager类提供的方法,也可以使用NSData类提供的方法。
- 方法一:使用NSData类的writeToFile方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T120_14649.jpg?sign=1738912679-477FgRnUsxlhxD4pGP8a5XdzEDcK5uOx-0-9b97027b4c69b605eac7d6e2f937ce2f)
- 方法二:使用NSFileManager类提供的createFileAtPath方法。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T120_14651.jpg?sign=1738912679-QPoGz9OqQ38vM9ELs4Fazx51Jw3xFrLZ-0-ab4deabcf3d81fa55aa649646454b8aa)
3.示例代码
下方的示例代码演示了对文件内容的读取以及解码(NSData转NSString),以及把NSData对象写入文件进行保存的过程。
- 首先在桌面上创建一个myfile.txt文件,并在文件中输入一些文字内容。
- 在main()函数中,编写如下代码。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-T121_82842.jpg?sign=1738912679-7Yia4EazuZTcLWrW9Fp54WFZrTYwjxep-0-5831e6163700a70556da33b91af7500b)
运行结果如图4-32所示。
![](https://epubservercos.yuewen.com/D4B438/15253388904120706/epubprivate/OEBPS/Images/Figure-P121_14818.jpg?sign=1738912679-SENxqOjRBGOJ7hiDfiWEOkgf1rlSTmXG-0-b81fba6248ba9223eabcc763c5e6f040)
图4-32 运行结果