C ++からJavaにファイル名を渡す方法について

画像
クロスプラットフォームアプリケーションでは、満たされないもの。 または書く。 ここで、先日、彼らは別のハリネズミの毛に対して出産し、慎重にレイアウトされたレーキ踏みました。今回はケシの下で。



佐賀の以前のシリーズ: Windowsでのレーキを思い出させてください。

つまり、同じエキゾチックなハリネズミ+ python =有刺鉄線がまだあります。 今回は幸せが訪れました。ケシに驚きました。 InDesignのJavaが統合され、機能するようになりました。次に、記述されたJavaコードにファイル名を転送する必要があります。

ダークナイト:始まり


それはすべてとても平凡に始まりました:
void FooExpFilter::ExportToStream( IPMStream* stream, IDocument* doc, IPMUnknown* targetboss, const PMString& formatName, UIFlags uiFlags) { IDFile outputFile; InterfacePtr<IFileStreamData> fileData(stream, IID_IFILESTREAMDATA); outputFile = fileData->GetSysFile(); SDKFileHelper fh(outputFile); PMString pathID = fh.GetPath(); WideString pathWID(pathID); std::string xID; StringUtils::ConvertWideStringToUTF8 (pathWID, xID); 

MacとWindowsで作業しました。 これまでのところ、InDesignはバージョンCS5.5まで成長していません。 そして、私たちのお気に入りで壮大なjava.io.FileNotFoundExceptionがログに追加されました

スターウォーズ:帝国の逆襲


余談ですが、これらのログエントリは「何が起きても」大いに役立ちます。 もちろん、賢明にログを書いていない限り、(個人的には見た!)大量のログからパフォーマンスが低下し、「コーデック」(C)は40秒間ログを書き込みましたが、0.5秒ログなしで動作します。 ヒンズー教徒は最善を尽くしました-彼らはlog4jをブラックジャックで書きましたが、バッファリングはしませんでした。

クライアントからログを取得すると、 Macintosh HD :: Foo :: Bar

プロストヴァシノで私たちに来てください-あなたがボールガウンを持っていない場合


クイックグーグル(Unixでのカーボンポピーのパスの変換方法)は、マウントポイントに基づいて手を変換する方法の詳細な指示につながります。 そして、Finderに何をどのような順序で尋ねるかの例としてのapplescript。 ええ、そうです-ObjectiveCだけでは、私たちが完全に満足するのに十分ではありませんでした。

一杯のコーヒーを半分飲んで、Adobe SDKを消費したことで、その価値のあるソリューションが見つかりました。 ここにある。

  IDFile outputFile; InterfacePtr<IFileStreamData> fileData(stream, IID_IFILESTREAMDATA); outputFile = fileData->GetSysFile(); // URL for java PMString pathJ = FileUtils::SysFileToFileURL(outputFile); WideString pathWJ(pathJ); std::string xj; StringUtils::ConvertWideStringToUTF8 (pathWJ, xj); 

Javaにはさらに3行あります。
  if(externFile.startsWith("file://")) { File externFd = new File(new java.net.URI(externFile)); externFile = externFd.getAbsolutePath(); } 


つまり、パスを渡す方法を見つけるのではなく、... URLを渡しました。

そしてそれも機能します。

免責事項 :正しい例をあきらめません-ObjectiveCなしでカーボンパスをUnixに変換する方法。 無関係ですが、興味深いです。 「頭を切り取って::を/に変更する」のではなく、それが存在する場合、私は自分で間違って行うことができます。

マインドゲーム:どうすればもっと良くできる


アップデート1notorcaは、ポピーCFURLCopyFileSystemPathの使用を提案しました。

 void FooExpFilter::ExportToStream( IPMStream* stream, IDocument* doc, IPMUnknown* targetboss, const PMString& formatName, UIFlags uiFlags) { IDFile outputFile; InterfacePtr<IFileStreamData> fileData(stream, IID_IFILESTREAMDATA); outputFile = fileData->GetSysFile(); #ifdef WINDOWS SDKFileHelper fh(outputFile); PMString pathID = fh.GetPath(); #endif #ifdef MACINTOSH FSSpec fsSpec; PMString pathID; OSErr err = FileUtils::IDFileToFSSpec(outputFile, fsSpec); if (err == noErr) { FSRef fsRef; err = MacFileUtils::FSSpecToFSRef(fsSpec, fsRef); if (err == noErr) { CFURLRef appURL = ::CFURLCreateFromFSRef(NULL, &fsRef); CFStringRef app_str = ::CFURLCopyFileSystemPath(appURL, kCFURLPOSIXPathStyle); if (app_str) { pathID.SetCFString(app_str); ::CFRelease(app_str); } if (appURL) ::CFRelease(appURL); } } #endif WideString pathWID(pathID); std::string xID; StringUtils::ConvertWideStringToUTF8 (pathWID, xID); 


アップデート2 :そしてstrizhは別のヒントを与えました-FileUtils :: FileURLToPosixPathを使用できます。この場合、コードは次のようになります。

  IDFile outputFile; InterfacePtr<IFileStreamData> fileData(stream, IID_IFILESTREAMDATA); outputFile = fileData->GetSysFile(); #ifdef WINDOWS SDKFileHelper fh(outputFile); PMString pathID = fh.GetPath(); WideString pathWID(pathID); std::string xfinal; StringUtils::ConvertWideStringToUTF8 (pathWID, xfinal); #endif #ifdef MACINTOSH PMString pathJ = FileUtils::SysFileToFileURL(outputFile); WideString pathWJ(pathJ); std::string xj; StringUtils::ConvertWideStringToUTF8 (pathWJ, xj); std::string xfinal = FileUtils::FileURLToPosixPath(xj); #endif 


URLを使用する場合-オプションがあります。 パス-> URL-> posixパスの移行なしでは、これまでにヒントを受け取っていません(いや、ObjectiveCに作品を持ち込むことにまだ同意しません)。

Source: https://habr.com/ru/post/J148115/


All Articles