1

絶対パスを使用してファイルを開こうとしています。私のアプリはobjective-cを使用して開きたいファイルを送信し、Cを使用して開きます。これを使用して開こうとします

NSString *str = [[NSString alloc]init];
NSOpenPanel *o = [[NSOpenPanel alloc]init];
[o setAllowsMultipleSelection:NO];
[o setCanChooseDirectories:NO];
[o setCanChooseFiles:YES];
[o setPrompt:@"Open"];
if ([o runModal] == NSOKButton )
{
    // Get an array containing the full filenames of all
    // files and directories selected.
    NSArray* files = [o URLs];

    // Loop through all the files and process them.
    int i;
    for( i = 0; i < [files count]; i++ )
    {
        NSString* fileName = [[files objectAtIndex:i] absoluteString];
        NSLog(@"%@", fileName);

        str = [NSString stringWithFormat:@"%s", openFile([fileName UTF8String])];
        self.tv.string = str;
    }

}

openfileメソッドはこれです

char *openFile(const char file[1024]){
FILE *f = fopen(file, "r");
static char c[1000];
char *d;
if (f!=NULL) {
    if (fgets(c, 1000, f) !=NULL){
        d = c;
    }
    else{
        d = "No text";
    }
}
else{
    d="error";
    perror(f);
}
fclose(f);

return d;
}

のような絶対パスを送信しますfile://localhost/Users/macuser/test.txtが、をperror(f); 返しますNo such file or directory。ファイルが存在することがわかっているのに、なぜこれが発生するのですか?

4

1 に答える 1

4

file://localhost/Users/macuser/test.txtはURIであり、ファイルパスではありません。文字列を処理して、/localhostそれまでのすべてを取り除きます。これで問題ありません。

この種のソリューションは、URIにエスケープシーケンスがない場合にのみ機能することに注意してください。以下に示すように、ObjectiveC側からパスを送信する方が簡単な場合があります。

于 2013-03-09T17:04:14.417 に答える