1

プログラムでHTMLファイルを作成しようとしています。しかし、生成されたファイルは空白のファイルとして表示されました。問題はわかりません。

これが私のコードです:

- (IBAction) createFileAction
{
    NSLog(@"************* createFileAction *************");
    NSMutableString *htmlString = [[NSMutableString alloc] init];
    NSLog(@"%@",htmlString);
    [htmlString appendString:@"<html><head><title></title><style type='text/css'>.style1{height: 27px;}#Text1{height: 19px;width: 210px;}.style2{width: 255px;}.style3{height: 27px;width: 255px;}#petValue{width: 206px;}#nameValue{width: 206px;}#dateValue{width: 209px;}"];
    [htmlString appendString:@"#Text2{width: 215px;}#Text3{width: 210px;height: 22px;}#Text4{width: 209px;}.style8{width: 13px;}.style9{ width: 263px;}.style10{height: 27px;width: 263px;}"];
    [htmlString appendString:@".style11{width: 418px;}.style12{width: 199px;}.style13{height: 27px; width: 199px;}.style14{height: 24px;}.style15{width: 410px;}</style> </head>"];
    [htmlString appendString:@"<body>"];

    NSString *originalString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http://www.makepartsfast.com/2012/09/4337/more-3d-printing-in-metals-ex-one-introduces-the-m-flex-3d-printing-system/"] encoding:NSUTF8StringEncoding error:nil];
    NSScanner *scanner = [NSScanner scannerWithString:originalString];
    NSString *extractedString = nil;


    [scanner scanUpToString:@"<div class=\"postarea\">" intoString:nil];
    [scanner scanString:@"<div class=\"postarea\">" intoString:nil];



    [scanner scanUpToString:@"<div style=\"clear:both;\">" intoString:&extractedString];


    if (extractedString) 
    {
        // string was extracted
        NSLog(@"%@", extractedString);
    }   
    NSLog(@"BEFORE= %@",htmlString);
    [htmlString appendString:extractedString];
     NSLog(@"AFTER= %@",htmlString);
    [htmlString appendString:@"</body></html>"];
    NSLog(@"FINAL=%@",htmlString);

    // check to see if file already exists in documents directory
    if([self.fileMgr fileExistsAtPath:self.file])
    {
        NSLog(@"File already exists");
    }
    else 
    {
        NSLog(@"file does not exist");
        NSLog(@"Try creating the file");

        // file does not already exist so create it
        [self.fileMgr createFileAtPath:file contents:nil attributes:nil];

        NSLog(@"%@",htmlString);
        [htmlString writeToFile:self.file atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];


        //Test again whether this file exists now that we have tried creating it
        if([self.fileMgr fileExistsAtPath:self.file])
        {
            NSLog(@"File exists now");
        }
        else 
        {
            NSLog(@"File still doesn't exist");
        }

    }
}

このメソッドでは、HTML形式のextractedStringのURLから選択した部分のみを取得し、それをhtmlstringに追加します。別の文字列を追加しようとすると、正常に機能します。

4

1 に答える 1

5

それはあなたが議論NSStringEncodingConversionAllowLossyとして渡したからです。encoding文字列エンコーディング引数の1つを渡す必要があります。何が起こっているのかはNSStringEncodingConversionAllowLossy1に等しいということです。しかしwriteToFile:atomically:encoding:error:、文字列エンコーディング定数を期待しています。1に等しい文字列エンコーディング定数はNSASCIIStringEncodingです。ただし、文字列をASCIIに変換できないため、空のファイルが取得されます。その行をUTF8を使用するように変更すると、期待される空でないファイルが得られます。

[htmlString writeToFile:self.file atomically:NO encoding:NSUTF8StringEncoding error:nil];

リターンタイプやエラー状態をチェックしていないため、少なくとも部分的にこれに問題がありました。メソッド呼び出しが返され、問題が発生した場合にifBOOLが作成されます。NSErrorあなたが聞いていたら、これはあなたが何が悪かったのかを理解するのを助けたでしょう。これを行った場合:

NSError *saveError = nil;
if (![htmlString writeToFile:file atomically:NO encoding:NSStringEncodingConversionAllowLossy error:&saveError]) {
    NSLog(@"Error writing file: %@", saveError);
}

次のようなエラーメッセージが表示されます。

2012-11-21 11:20:47.250 Untitled[5731:707] Error writing file: Error Domain=NSCocoaErrorDomain Code=517 "The file “junk.html” couldn’t be saved using text encoding Western (ASCII)." UserInfo=0x7ffc0860b7c0 {NSFilePath=/tmp/junk.html, NSStringEncoding=1

それは最初は明らかではないかもしれませんが、ASCIIを使用しようとしていることが具体的に言及されているという事実は、問題の原因の大きな手がかりになります。

于 2012-11-21T18:25:59.437 に答える