19

プログラム (Mac OS X 用、Objective-C を使用) を作成しており、プログラムで一連の .webloc ファイルを作成する必要があります。

.webloc ファイルは、Safari のロケーション バーから特定のフォルダに URL をドラッグ アンド ドロップした後に作成される単純なファイルです。

一般的に言えば、Web のある場所を指すファイル システム内にアイテムを作成する方法が必要です。私が理解しているように、Mac OS X では .webloc ファイルを使用する必要があります。

では、有効な URL とタイトルを持つ .webloc ファイルを作成することは可能ですか?

4

7 に答える 7

23

あまり知られていませんが、webloc用の単純なplistベースのファイル形式もあります。

weblocファイルを作成する場合、他の3つのポスターで説明されているリソースメソッドを使用してファイルを保存する必要はありません。簡単なplistを書くこともできます:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>URL</key>
    <string>http://apple.com</string>
</dict>
</plist>

バイナリリソース形式はまだアクティブに使用されており、plistファイルを読み取りたい場合は、両方のファイル形式を読み取る必要があることを確認してください。しかし、ファイルを作成するときは(plistベースの形式を使用してください)、はるかに簡単です。

于 2008-09-28T23:04:16.657 に答える
7

ファイルの.weblocデータ フォークには何もありません。代わりに、リソースとして参照する URL をリソース フォークに格納します。これは、 DeRez(1)ツールを使用してコマンド ラインで確認できます。

ここでは.webloc、この質問のために Safari のアドレス バーからドラッグしたファイルに対して実行しました。

% DeRez "Desktop/Crafting .webloc file - Stack Overflow.webloc"
data 'drag' (128, "Crafting .webloc file -#1701953") {
    $"0000 0001 0000 0000 0000 0000 0000 0003"            /* ................ */
    $"5445 5854 0000 0100 0000 0000 0000 0000"            /* TEXT............ */
    $"7572 6C20 0000 0100 0000 0000 0000 0000"            /* url ............ */
    $"7572 6C6E 0000 0100 0000 0000 0000 0000"            /* urln............ */
};

data 'url ' (256, "Crafting .webloc file -#1701953") {
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"            /* http://stackover */
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"            /* flow.com/questio */
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"            /* ns/146575/crafti */
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"                 /* ng-webloc-file */
};

data 'TEXT' (256, "Crafting .webloc file -#1701953") {
    $"6874 7470 3A2F 2F73 7461 636B 6F76 6572"            /* http://stackover */
    $"666C 6F77 2E63 6F6D 2F71 7565 7374 696F"            /* flow.com/questio */
    $"6E73 2F31 3436 3537 352F 6372 6166 7469"            /* ns/146575/crafti */
    $"6E67 2D77 6562 6C6F 632D 6669 6C65"                 /* ng-webloc-file */
};

data 'urln' (256, "Crafting .webloc file -#1701953") {
    $"4372 6166 7469 6E67 202E 7765 626C 6F63"            /* Crafting .webloc */
    $"2066 696C 6520 2D20 5374 6163 6B20 4F76"            /*  file - Stack Ov */
    $"6572 666C 6F77"                                     /* erflow */
};

おそらくそこにある必要がある唯一のリソースは、ID 256 の'url ''TEXT'リソースであり、おそらくリソース名も必要ありません。'urln'URL が指すドキュメントのタイトルも含めたい場合、このリソースは便利です。リソースは、これ'drag'がクリッピング ファイルであることをシステムに伝えますが、この時代に必要かどうかはわかりません。

リソースとファイルのリソース フォークを操作するには、リソース マネージャーを使用します。これは、元の Mac に戻る Carbon の基盤となる部分の 1 つです。ただし、 Nathan Day の NDResourceForkなど、Resource Manager 用の Cocoa ラッパーがいくつかあります。

于 2008-09-28T20:15:19.607 に答える
7

.weblocファイル (より一般的には、インターネット ロケーション ファイル) は、その定義が Mac OS 8.x にさかのぼる形式で書き込まれます。これはリソースベースで、テキストや画像などのドラッグされたオブジェクトからファイルを作成するときに得られるクリッピング形式から派生しています。

書き込まれるリソースは、URL を格納する'url '256 と'TEXT'256 であり、オプションで、URL に関連付けられたテキストを含む 'urln' 256 です。 'drag'128 は、他の 2 つ (または 3 つ) のリソースを指します。

Cocoatechオープン ソース フレームワークCocoaTechFoundation (BSD ライセンス)の一部であるNTWeblocFile は、Objective-C からのこれらのファイルの書き込みをサポートしています。URL とは別にタイトルを指定する場合は、リソースに URL 以外のものを書き込むようにクラスを変更する必要があります'urln'

Mac OS X 10.3 以降では、URL はファイルのデータ フォークのプロパティ リストにも書き込まれます (書き込まれる場合もあります)。これがどのように機能するかについては、他の回答を参照してください...

于 2008-09-28T20:16:33.173 に答える
5

「Web ショートカット」を作成するもう 1 つの方法は、.urlここで既に説明したファイルです。
内容は次のようになります (plist xml ベースよりもはるかに単純です):

[InternetShortcut]
URL=http://www.apple.com/

ファイルには 3 行あり、最後の行は空です。

.url ファイル形式の詳細

于 2008-09-29T08:25:23.110 に答える
2

リソースフォークベースのバイナリ形式を使用します。

有効な回避策:

  • ユーザーに、アプリケーション(NSURLPboardType)からFinderにURLをドラッグしてもらいます。FinderがWeblocを作成します。
  • Windows Webショートカット(.URLファイル)を作成します。これらはINIのようなデータフォークベースの形式であり、インターネット上のどこかに文書化する必要があります。OSはweblocをサポートしているため、それらをサポートしています。
于 2008-09-28T20:02:12.320 に答える
1

Google Chrome での方法は次のとおりです: WriteURLToNewWebLocFileResourceFork

于 2012-09-05T14:28:32.970 に答える
0

これは、サードパーティのライブラリを必要とせずに、基本的なタスクを実行します。(警告: 最小限のエラー チェック。)

// data for 'drag' resource (it's always the same)
#define DRAG_DATA_LENGTH 64
static const unsigned char _dragData[DRAG_DATA_LENGTH]={
    0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
    0x54, 0x45, 0x58, 0x54, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x75, 0x72, 0x6C, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x75, 0x72, 0x6C, 0x6E, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

static void _addData(NSData *data, ResType type, short resId, ResFileRefNum refNum)
{
    Handle handle;
    if (PtrToHand([data bytes], &handle, [data length])==noErr) {
        ResFileRefNum previousRefNum=CurResFile();
        UseResFile(refNum);

        HLock(handle);
        AddResource(handle, type, resId, "\p");
        HUnlock(handle);

        UseResFile(previousRefNum);
    }
}

void WeblocCreateFile(NSString *location, NSString *name, NSURL *fileUrl)
{
    NSString *contents=[NSString stringWithFormat:
                        @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
                        @"<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
                        @"<plist version=\"1.0\">\n"
                        @"<dict>\n"
                        @"<key>URL</key>\n"
                        @"<string>%@</string>\n"
                        @"</dict>\n"
                        @"</plist>\n", location];

    if ([[contents dataUsingEncoding:NSUTF8StringEncoding] writeToURL:fileUrl options:NSDataWritingAtomic error:nil])
    {        
        // split into parent and filename parts
        NSString *parentPath=[[fileUrl URLByDeletingLastPathComponent] path];
        NSString *fileName=[fileUrl lastPathComponent];

        FSRef parentRef;
        if(FSPathMakeRef((const UInt8 *)[parentPath fileSystemRepresentation], &parentRef, NULL)==noErr)
        {
            unichar fileNameBuffer[[fileName length]];
            [fileName getCharacters:fileNameBuffer];

            FSCreateResFile(&parentRef, [fileName length], fileNameBuffer, 0, NULL, NULL, NULL);
            if (ResError()==noErr)
            {
                FSRef fileRef;
                if(FSPathMakeRef((const UInt8 *)[[fileUrl path] fileSystemRepresentation], &fileRef, NULL)==noErr)
                {
                    ResFileRefNum resFileReference = FSOpenResFile(&fileRef, fsWrPerm);
                    if (resFileReference>0 && ResError()==noErr)
                    {
                        _addData([NSData dataWithBytes:_dragData length:DRAG_DATA_LENGTH], 'drag', 128, resFileReference);
                        _addData([location dataUsingEncoding:NSUTF8StringEncoding], 'url ', 256, resFileReference);
                        _addData([location dataUsingEncoding:NSUTF8StringEncoding], 'TEXT', 256, resFileReference);
                        _addData([name dataUsingEncoding:NSUTF8StringEncoding], 'urln', 256, resFileReference);
                        CloseResFile(resFileReference);
                    }
                }
            }
        }
    }
}
于 2012-09-05T09:53:42.933 に答える