3

ファイルパスをクリップボードにコピーして、テキストエディタで文字列としてコピーできるようにしたいのですが、Finderでもファイルをコピーできるようにしたいと思います。

Snow Leopardガイドラインに準拠して以下に示すコードを作成しました(たとえば、ファイルのURLをコピーするときにwriteObjectsを使用します)

NSString* path1 = @"/Users/dave/trash/mas.sh";
NSString* path2 = @"/Users/dave/trash/books.xml";
NSURL* url1 = [NSURL fileURLWithPath:path1 isDirectory:NO];
NSURL* url2 = [NSURL fileURLWithPath:path2 isDirectory:NO];
NSArray* paths = [NSArray arrayWithObjects:path1, path2, nil];

NSString* pathPerLine = [paths componentsJoinedByString:@"\n"];
// Put strings on top otherwise paster app receives the url (only the first)
// Urls will be used by Finder for files operations (copy, move)
NSArray* urls = [NSArray arrayWithObjects:pathPerLine, url1, url2, nil];
NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents];
[pasteboard writeObjects:urls];

ただし、一部のエディター(XCodeなど)では、以下に示すようにURLも貼り付けられます(FinderはURLを正しく使用してコピー/移動します)

/Users/dave/trash/mas.sh
/Users/dave/trash/books.xml
file://localhost/Users/dave/trash/mas.sh
file://localhost/Users/dave/trash/books.xml

10.6準拠のコードを使用して、ファイルURLなしでファイルパスのみを貼り付けるにはどうすればよいですか?

NSFilenamesPboardTypeの使用推奨されていないようです

NSFilenamesPboardType1つ以上のファイル名を指定するNSStringオブジェクトの配列。Mac OS X v10.6以降では、writeObjects:を使用してファイルのURLをペーストボードに書き込みます。Mac OSXv10.0以降で利用できます。NSPasteboard.hで宣言されています。

4

1 に答える 1

5

ドキュメントは、を使用する必要があるように聞こえるかもしれませんwriteObjects:が、これはファイルのURLにのみ使用します。

NSPasteboard.hの下部には、次のセクションがあります。

APPKIT_EXTERN NSString *NSStringPboardType;     // Use NSPasteboardTypeString
APPKIT_EXTERN NSString *NSFilenamesPboardType;      // Use -writeObjects: to write file URLs to the pasteboard

writeObjects:これらは使用すべきではない古いタイプですが、ファイルURL(またはURL)を配置しようとするときにのみ使用することを示しています。そして、他のデータのタイプを使用します。

したがって、正しい動作を取得するには、次のようにします。

NSString* path1 = @"/Users/dave/trash/mas.sh";
NSString* path2 = @"/Users/dave/trash/books.xml";
NSURL* url1 = [NSURL fileURLWithPath:path1 isDirectory:NO];
NSURL* url2 = [NSURL fileURLWithPath:path2 isDirectory:NO];
NSArray* paths = [NSArray arrayWithObjects:path1, path2, nil];

NSString* pathPerLine = [paths componentsJoinedByString:@"\n"];

//Note, only the URLs not the pathsPerLine
NSArray* urls = [NSArray arrayWithObjects:url1, url2, nil];
NSPasteboard* pasteboard = [NSPasteboard generalPasteboard];
[pasteboard clearContents];
[pasteboard writeObjects:urls];
//Now add the pathsPerLine as a string
[pasteboard setString:pathPerLine forType:NSStringPboardType];
于 2012-08-21T13:29:15.593 に答える