用户/用户名/库目录会发生啥。为啥我不能更改当前目录?

Posted

技术标签:

【中文标题】用户/用户名/库目录会发生啥。为啥我不能更改当前目录?【英文标题】:What happens to the Users/username/Library directory. Why can't I change the current directory?用户/用户名/库目录会发生什么。为什么我不能更改当前目录? 【发布时间】:2014-11-22 20:08:26 【问题描述】:

我正在关注 Stephen Kochan 的“Objective-C 第四版编程”中的代码示例。

程序查找一个文件,并对其执行一些操作:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) 
    @autoreleasepool 
        NSString *fName = @"testfile";
        NSFileManager *fm;
        NSDictionary *attr;

        //Need to create an instance of the file manager

        fm = [NSFileManager defaultManager];

        //Let's make sure our test file exists first


        NSLog([fm currentDirectoryPath]);

        if ([fm fileExistsAtPath: fName] == NO) 
            NSLog(@"File doesn't exist!");
            return 1;
        

        //now lets make a copy

        if ([fm copyItemAtPath: fName toPath: @"newfile" error: NULL]) 
            NSLog(@"File Copy failed!");
            return 2;
        

        //Now let's see test to see if the two files are equal

        if ([fm contentsEqualAtPath: fName andPath: @"newfile"] == NO) 
            NSLog(@"Files are Not Equal!");
            return 3;
        

        //Now lets rename the copy
        if ([fm moveItemAtPath: @"newfile" toPath: @"newfile2" error: NULL] == NO) 
            NSLog(@"File rename Failed");
            return 4;
        

        //get the size of the newfile2

        if((attr = [fm attributesOfItemAtPath: @"newfile2" error: NULL]) == nil)
        
            NSLog(@"Couldn't get file attributes");
            return 5;
        

        NSLog(@"File size is %llu bytes", [[attr objectForKey: NSFileSize] unsignedLongLongValue]);

        //And finally, let's delete the original file

        if([fm removeItemAtPath: fName error: NULL])
        
            NSLog(@"file removal failed");
            return 6;
        

        NSLog(@"All operations were successful");

        //Display the contents of the newly-createed file

        NSLog(@" %@", [NSString stringWithContentsOfFile: @"newfile2" encoding:NSUTF8StringEncoding error: NULL]);
    
    return 0;

我创建了一个名为“testfile”的文件并将其放在项目目录中。当我运行程序时,它找不到该文件。我添加了 [NSFileManager currentDirectoryPath] 来检查当前路径,这显然是这样的:

/Users/myusername/Library/Developer/Xcode/DerivedData/Prog_16.1-eekphhgfzdjviqauolqexkowfqfg/Build/Products/Debug

我去寻找图书馆目录,但它不存在。这是程序运行时创建的临时目录,退出后删除吗?

编辑:我尝试使用 [NSFileManager changeCurrentDirectoryPath: newPath] 更改当前目录的路径,但无法更改路径。我尝试将 newPath 设置为 @"Users/username/Desktop",但也失败了!

【问题讨论】:

请参阅this answer at apple.stackexchange.com 了解如何访问库文件夹。 【参考方案1】:

Library 目录确实存在,但它作为标准是隐藏的。打开终端并输入命令:chflags nohidden ~/Library/。

然后再看一遍,它会神奇地出现在那儿!

编辑:对于使用 NSFileManager 进行编程,有一个非常有用的函数:NSSearchPathForDirectoriesInDomains()。例如。获取桌面do目录:

NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"test.txt"];
NSString *test = @"hello";
[test writeToFile:path atomicallly:YES];

这会将一个小 txt 文件写入您的桌面。 (只要您的应用程序没有被沙盒化)。

希望这会有所帮助。

【讨论】:

【参考方案2】:

当您将文件放在项目目录中时,它会作为应用程序包的一部分提供。要获取捆绑目录树,请使用NSBundle...

// use the file extension (if any) for the ofType: param
NSString *path = [[NSBundle mainBundle] pathForResource:@"testfile" ofType:@""];
if ([[NSFileManager defaultManager] fileExistsAtPath:path]) 
    NSLog(@"there it is!  %@", path);

【讨论】:

刚刚注意到这个问题被标记为 osx,而不是 ios。不确定这个答案是否适用,但可能。

以上是关于用户/用户名/库目录会发生啥。为啥我不能更改当前目录?的主要内容,如果未能解决你的问题,请参考以下文章

iOS Safari Web 扩展 - 当我们添加新的所需权限时,当前用户会发生啥

在运行后台进程时更改分支会发生啥?

如果我在 Linux 上更改 C++ 动态共享库而我的可执行程序在它上面使用会发生啥

linux用啥命令修改目录名称?

如果他们更改 PHP 密码库中的 PASSWORD_DEFAULT 会发生啥?

为啥arcgis里,鼠标的图标都变成放大镜不能用了