TKMFileManager 是一个简单的工具,用于管理您的 iOS App 的文件,使用 Objective-C 编写(Swift 即将推出)。您不必使用 NSFileManager 和大量代码来执行简单操作,只需使用 TKMFileManager 就可以在一行代码中完成!
坦白说,它并没有什么特别之处——除了不再需要写这样的代码
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *newDirectory = [documentsDirectory stringByAppendingPathComponent:@"/newDirectory"];
if (![[NSFileManager defaultManager] fileExistsAtPath:newDirectory])
{
[[NSFileManager defaultManager] createDirectoryAtPath:newDirectory withIntermediateDirectories:NO attributes:nil error:nil];
}
您可以简单地写成这样
TKMFileManager *manager = [[TKMFileManager alloc] init];
[manager createSubdirectory:@"/NewDirectory" inDirectory:manager.documentsDirectory];
当然,几乎每个人都可以写出类似的东西,但为什么要麻烦自己去写呢——这是免费的!
此外,这是 GitHub 上唯一带有 Appldoc 样式文档的文件管理器,可以在这里找到
要创建一个新的 TKMFileManager 对象(在本例中命名为 manager),只需编写
TKMFileManager *manager = [[TKMFileManager alloc] init];
如果您出于某种原因不想立即初始化它,您可以简单地写入
TKMFileManager *manager = [TKMFileManager alloc];
但是,在您可以使用它之前,您 必须 初始化 TKMFileManager 对象
[manager init];
现在您已经创建了一个 TKMFileManager 对象,您就可以开始管理文件了
TKMFileManager 默认不会指向任何特定目录,所以在创建新目录时,您需要指定新目录的 完整 路径。幸运的是,这很容易,因为 TKFileManager 提供了对您可能要使用的目录的轻松访问
manager.documentsDirectory //Path for the Documents Directory
manager.mainBundleDirectory //Path for the Main Bundle's directory
因此,要在您的应用程序的 Documents 目录中创建新目录,您只需说
[manager createDirectory:[manager.documentsDirectory stringByAppendingPathComponent:@"NewDirectory"]];
或者,您可以使用 createSubdirectory
方法完成此操作
[manager createSubdirectory:@"NewDirectory" inDirectory:manager.documentsDirectory];
为了方便您,createSubdirectory
非常智能,如果您忘记在子目录名前添加 "/",它会自动为您添加。
使用 createDirectory
时,您需要在路径的字符串中已经包含 "/",或者您需要使用 stringByAppendingPathComponent
。
复制目录会将目录的文件在新的位置创建副本,同时保留原始目录中的文件。
要复制目录,您需要指定要复制的目录的完整路径和目标目录的完整路径。如果目标目录不存在,它将被创建。在此示例中,我们将复制 mainBundleDirectory
的内容到 documentsDirectory
。
[manager copyDirectory:manager.mainBundleDirectory toDirectory:manager.documentsDirectory];
注意:这并不会在 Documents 目录中创建一个 "mainBundle" 子目录,而是直接将 mainBundleDirectory
的内容复制到 documentsDirectory
。
如果您希望内容复制到 Documents 目录的子目录中,您需要首先创建该子目录,然后将其复制进去。
NSString *mainBundleInDocuments = [manager.documentsDirectory stringByAppendingPathComponent:@"MainBundleFiles"];
[manager copyDirectory:manager.mainBundleDirectory toDirectory:mainBundleInDocuments];
移动目录会将目录的文件移动到新的位置。由于文件不再在原始目录中,因此它们将无法在该目录中找到。如果目标目录不存在,它将被创建。
与复制目录类似,在移动目录时,您必须指定源目录的完整路径和目标目录的完整路径。
NSString *mainBundleInDocuments = [manager.documentsDirectory stringByAppendingPathComponent:@"MainBundleFiles"];
[manager moveDirectory:manager.mainBundleDirectory toDirectory:mainBundleInDocuments];
注意:不推荐将 mainBundleDirectory
的内容移动到任何其他目录。
删除目录将删除其内容以及目录本身从父目录中。
要删除目录,您只需使用 deleteDirectory
方法。
//(this example assumes "mainBundleInDocuments" is a valid variable)
[manager deleteDirectory:mainBundleInDocuments];
如果您尝试删除的目录不存在,将不会发生任何操作。
如果您知道文件的完整路径,您可以将它复制到一个目录中(如果目标目录不存在,它将被创建)。
[manager copyFile:[manager.mainBundleDirectory stringByAppendingPathComponent:@"default.n64skin"] toDirectory:manager.documentsDirectory];
如果您知道文件的完整路径,您可以将它移动到一个目录中(如果目标目录不存在,它将被创建)。
[manager moveFile:[manager.mainBundleDirectory stringByAppendingPathComponent:@"default.2600skin"] toDirectory:manager.documentsDirectory];
记住:如果您移动文件,它将不再在原始目录中。
如果您知道文件的完整路径,您可以使用 deleteFile
方法删除它。
[manager deleteFile:[manager.documentsDirectory stringByAppendingPathComponent:@"testROM.z64"]];
如果您知道文件所在的目录,您可以使用 getFile
方法获取其完整路径。
NSString *dogeMemePath = [manager getFile:@"doge.png" inDirectory:manager.documentsDirectory];
这将遍历目录及其子目录,并将文件的完整路径返回给您(如果您不知道它是否在子目录中,这很方便)。
但是,如果你的文件存储位置不清楚怎么办呢?嗯,使用TKMFileManager独有的findAndGetFile
方法,它将搜索所有可用的目录(目前仅限主包和文档)及其所有子目录,直到找到你的文件
NSString *triggeredMemePath = [manager findAndGetFile:@"triggered.png"];
此功能也适用于移动、复制和删除文件,如下所示
[manager findAndCopyFile:@"repost.png" toDirectory:manager.documentsDirectory];
[manager findAndMoveFile:@"moveItSomewhereElsePatrick.png" toDirectory:manager.documentsDirectory];
[manager findAndDeleteFile:@"harambe.png"];
TKMFileManager遵循MIT许可证,许可证全文可在许可证文件中查看。
根据MIT许可证的要求,需要进行归属权声明——此外,我也喜欢看到我所编写的代码如何帮助其他开发者和他们的用户!
如果您有一个使用TKMFileManager的绝佳项目,请联系我(信息见下文),我将确保将您的项目添加到列表中!
请将所有错误报告给GitHub上的“问题”页面。如果您有一个使用TKMFileManager的酷项目,需要帮助了解如何使用它(超出本指南所述),或只是想打个招呼,您可以通过以下方式联系我
Twitter
@TheTomMetzger
Email
[email protected]