我写了程序(for Mac OS X,使用目标-C)和我需要创造一大堆的。webloc文件编程。

。webloc文件仅仅是文件,该文件是后创造了你拖拽一网址Safari的位置吧到一些文件夹。

一般来说,我需要一个办法来创建的项目文件系统,这点对某些位置在网络上。正如我理解的。webloc文件应被用于这个Mac OS X.

因此,它是可能的工艺。webloc文件具有一个有效的网址和一些标题呢?

有帮助吗?

解决方案

鲜为人知 - 但是weblocs还有一个简单的基于plist的文件格式。

创建webloc文件时,不需要使用其他三张海报描述的资源方法保存它们。你也可以写一个简单的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的格式 - 这要容易得多。

其他提示

.webloc 文件(更一般地说,Internet位置文件)以一种格式编写,其定义可以追溯到Mac OS 8.x.它是基于资源的,源自从拖动对象(如文本或图像)创建文件时获得的剪切格式。

所写的资源是'url' 256和'TEXT' 256,它们存储URL,以及可选的'urln'256,包含与URL关联的文本。 'drag' 128指向其他两个(或三个)资源。

NTWeblocFile是 Cocoatech开源框架 CocoaTechFoundation(BSD许可)的一部分,支持编写这些文件来自Objective-C的文件。如果要分别为URL指定标题,则需要修改该类,以便将除URL以外的内容写入'urln'资源。

在Mac OS X 10.3及更高版本中,URL也会写入(也可能会写入)文件数据分叉中的属性列表。请参阅其他答案,了解其工作原理......

.webloc 文件的数据分叉中没有任何内容;相反,它将其引用的URL存储为其资源fork中的资源。您可以在命令行中使用 DeRez(1)工具

这里我在 .webloc 文件中运行它,我从Safari地址栏中拖出了这个问题:

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

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

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

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

可能需要的唯一资源是ID为256的'url''TEXT'资源,这些资源可能不需要资源名称无论是。如果您想要包含URL指向的文档的标题,那么'urln'资源可能会很方便。 'drag'资源告诉系统这是一个剪辑文件,但我不确定它是否需要在这个时代存在。

要使用资源和文件的资源分支,请使用资源管理器&#8212;碳的基础部分之一可以追溯到原来的Mac。但是,有一些资源管理器的Cocoa包装器,例如 Nathan Day的NDResourceFork

另一种制作“网页快捷方式”的方法是这里提到的 .url 文件。
内容看起来像(比基于xml的plist简单得多):

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

注意文件有3行,最后一行是空的。

有关.url文件格式的更多信息

它使用一个资源叉基础的二元格式。

有效的解决方法:

  • 有的用户拖一个网址从你的应用程序(NSURLPboardType)的搜索。的搜索将创建一个webloc你。
  • 创建一个窗户网快捷方式(.URL文件)。这些有INI-像数据叉基础的格式,并应记录在案的地方上因特网;OS支持他们,因为它支持weblocs.

以下是Google Chrome的用途: WriteURLToNewWebLocFileResourceFork

这是基本任务,无需任何第三方库。 (警告:最小错误检查。)

// 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);
                    }
                }
            }
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top