문제

저는 프로그램(Mac OS X용, Objective-C 사용)을 작성 중이고 프로그래밍 방식으로 여러 개의 .webloc 파일을 생성해야 합니다.

.webloc 파일은 Safari의 위치 표시줄에서 일부 폴더로 URL을 끌어서 놓은 후에 생성되는 단순한 파일입니다.

일반적으로 말하면 웹의 특정 위치를 가리키는 파일 시스템에 항목을 생성하는 접근 방식이 필요합니다.제가 알기로 Mac OS X에서는 .webloc 파일을 사용해야 합니다.

그렇다면 유효한 URL과 제목이 있는 .webloc 파일을 만드는 것이 가능합니까?

도움이 되었습니까?

해결책

거의 알려지지 않았지만 webloc을 위한 간단한 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 파일 (보다 일반적으로 인터넷 위치 파일)은 정의가 Mac OS 8.X로 돌아가는 형식으로 작성됩니다. 텍스트 나 이미지와 같은 드래그 된 객체에서 파일을 만들 때 얻을 수있는 클리핑 형식에서 파생 된 리소스 기반입니다.

작성된 자원은입니다 'url ' 256과 'TEXT' URL을 저장하는 256 및 선택적으로 URL과 관련된 텍스트를 포함하는 'URLN'256. 'drag' 다른 두 개 (또는 3 개) 자원에 대한 128 포인트.

ntweblocfile, 일부 Cocoatech 오픈 소스 프레임 워크 CocoateChfoundation (BSD 라이센스)은 객체 C에서 이러한 파일을 작성하는 것을 지원합니다. URL과 별도로 제목을 지정하려면 클래스를 수정하여 URL 이외의 것을 'urln' 자원.

Mac OS X 10.3 이후에서 URL은 파일의 데이터 포크의 속성 목록에 서면으로 작성됩니다. 이것이 어떻게 작동하는지에 대한 다른 대답을보십시오 ...

.webloc 파일의 데이터 포크에는 아무것도 없습니다.대신 리소스 포크에 리소스로 참조되는 URL을 저장합니다.명령줄에서 다음을 사용하여 이를 확인할 수 있습니다. 데레즈(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 */
};

거기에 있어야 할 유일한 리소스는 'url ' 그리고 'TEXT' ID 256의 리소스이며 아마도 리소스 이름도 필요하지 않을 것입니다.그만큼 'urln' URL이 가리키는 문서의 제목도 포함하려는 경우 리소스가 유용할 수 있습니다.그만큼 'drag' 리소스는 시스템에 이것이 클리핑 파일이라고 알려주지만 오늘날 이 파일이 거기에 있어야 하는지는 확실하지 않습니다.

리소스 및 파일의 리소스 포크로 작업하려면 원래 Mac으로 돌아가는 Carbon의 기본 부분 중 하나인 Resource Manager를 사용합니다.그러나 Resource Manager에는 다음과 같은 몇 가지 Cocoa 래퍼가 있습니다. Nathan Day의 NDResourceFork.

"웹 바로 가기"를 만드는 또 다른 방법은입니다 .url 이미 여기에 언급 된 파일.
내용은 (Plist XML 기반보다 훨씬 간단한) 것 같습니다.

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

참고 파일에는 3 줄이 있고 마지막 줄은 비어 있습니다.

.url 파일 형식에 대한 자세한 정보

리소스 포크 기반 바이너리 형식을 사용합니다.

유효한 해결 방법 :

  • 사용자가 응용 프로그램 (nsurlpboardtype)에서 Finder로 URL을 드래그하도록하십시오. Finder는 귀하를 위해 Webloc을 만듭니다.
  • Windows 웹 바로 가기 (.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