2009-12-18 31 views

Trả lời

4

Kể từ OS X 10.6, bạn có thể sử dụng NSUrl 's writeBookmarkData:toURL:options:error: phương pháp

Từ documentation:

Tạo một tập tin bí danh trên đĩa tại vị trí được chỉ định với dữ liệu dấu trang được chỉ định.

Mẫu mã:

NSURL *originalUrl = [NSURL fileURLWithPath:@"/this/is/your/path"]; 
NSURL *aliasUrl = [NSURL fileURLWithPath:@"/your/alias/path"]; 
NSData *bookmarkData = [originalUrl bookmarkDataWithOptions: NSURLBookmarkCreationSuitableForBookmarkFile includingResourceValuesForKeys:nil relativeToURL:nil error:NULL]; 

if(bookmarkData != nil) { 
    BOOL success = [NSURL writeBookmarkData:bookmarkData toURL:aliasUrl options:NSURLBookmarkCreationSuitableForBookmarkFile error:NULL]; 
    if(NO == success) { 
     //error 
    } 
} 

Tuy nhiên, bí danh tạo ra theo cách đó không tương thích ngược với các phiên bản hệ điều hành trước đó X (pre 10,6)

+0

Vì tôi quan tâm đến ít nhất OS X 10.6, đây là câu trả lời tôi đang tìm kiếm. Không có gì sai với mã Carbon trong một ứng dụng Cocoa, nhưng tôi thích sử dụng Cocoa, khi có thể. – kiamlaluno

+0

Tốt hơn bao giờ hết, phải không? :-) – codingFriend1

+0

Vâng, đúng vậy. ':)' – kiamlaluno

-1

Bạn muốn -[NSFileManager linkItemAtPath:toPath:error:]. AFIK, nó và các phương pháp liên quan của nó là phương tiện ưu tiên trên tất cả các phiên bản.

+2

Không phải là một bí danh khác với liên kết? Tôi nghĩ rằng tôi đọc rằng một bí danh Finder như một số tính năng không có trong một liên kết, mà sẽ làm cho nó thích hợp hơn để liên kết. – kiamlaluno

+1

Các liên kết cứng (như được tạo với chức năng được báo cáo) không thể được tạo trên ổ đĩa khác với mã nguồn. Một bí danh Finder trong kết hợp giữa liên kết mềm và liên kết cứng, có nghĩa là bí danh Finder sẽ hợp lệ ngay cả khi tệp được di chuyển và có thể đặt bí danh trên một ổ đĩa khác với khối lượng nguồn. – kiamlaluno

+1

Liên kết cứng là * không có gì * giống như bí danh. Liên kết cứng một tập tin đặt nó ở hai nơi hoặc dưới hai tên khác nhau (hoặc cả hai) cùng một lúc. Nó không tạo ra một tập tin mới của một loại đặc biệt (liên kết tượng trưng) hoặc với các nội dung đặc biệt (bí danh hoặc đánh dấu). –

4

Hãy xem How to Create an Alias Programmatically.

- (void)makeAliasToFolder:(NSString *)destFolder inFolder:(NSString *)parentFolder withName:(NSString *)name 
{ 
    // Create a resource file for the alias. 
    FSRef parentRef; 
    CFURLGetFSRef((CFURLRef)[NSURL fileURLWithPath:parentFolder], &parentRef); 
    HFSUniStr255 aliasName; 
    FSGetHFSUniStrFromString((CFStringRef)name, &aliasName); 
    FSRef aliasRef; 
    FSCreateResFile(&parentRef, aliasName.length, aliasName.unicode, 0, NULL, &aliasRef, NULL); 

    // Construct alias data to write to resource fork. 
    FSRef targetRef; 
    CFURLGetFSRef((CFURLRef)[NSURL fileURLWithPath:destFolder], &targetRef); 
    AliasHandle aliasHandle = NULL; 
    FSNewAlias(NULL, &targetRef, &aliasHandle); 

    // Add the alias data to the resource fork and close it. 
    ResFileRefNum fileReference = FSOpenResFile(&aliasRef, fsRdWrPerm); 
    UseResFile(fileReference); 
    AddResource((Handle)aliasHandle, 'alis', 0, NULL); 
    CloseResFile(fileReference); 

    // Update finder info. 
    FSCatalogInfo catalogInfo; 
    FSGetCatalogInfo(&aliasRef, kFSCatInfoFinderInfo, &catalogInfo, NULL, NULL, NULL); 
    FileInfo *theFileInfo = (FileInfo*)(&catalogInfo.finderInfo); 
    theFileInfo->finderFlags |= kIsAlias; // Set the alias bit. 
    theFileInfo->finderFlags &= ~kHasBeenInited; // Clear the inited bit to tell Finder to recheck the file. 
    theFileInfo->fileType = kContainerFolderAliasType; 
    FSSetCatalogInfo(&aliasRef, kFSCatInfoFinderInfo, &catalogInfo); 
} 

Bạn cũng có thể sử dụng AppleScript

osascript -e 'tell application "Finder" to make alias file to POSIX file "/Applications/myapp.app" at POSIX file "/Applications/"' 
+0

Bạn cũng có thể xem [Thư viện BDAlias] (https://github.com/rentzsch/bdalias). –

+0

Cần lưu ý rằng giải pháp này là cách lỗi thời (không dùng nữa). Sử dụng điều này chỉ khi bạn phải, và sử dụng 'writeBookmarkData' nếu bạn có thể. Xem http://stackoverflow.com/questions/37309635/ để tìm hiểu cách tạo tệp dấu trang từ bản ghi Bí danh. –

0

Tạo một tập tin bí danh trên đĩa tại một quy định vị trí với dữ liệu dấu trang được chỉ định bằng Swift3.

Sample Code:

let url = URL(string: "originalURL") 
let aliasUrl = URL(string: "aliasURL") 
do{ 
     let data = try url.bookmarkData(options: .suitableForBookmarkFile, includingResourceValuesForKeys: nil, relativeTo: nil) 
      try URL.writeBookmarkData(data, to: aliasUrl) 
    }catch{} 
Các vấn đề liên quan