2016-12-06 6 views
4

私は現在、Windowsソフトウェア(.exe)またはOS X app(.app)にバンドルされているプロジェクトをエクスポートして他のユーザーにデータを配布できるようにするJavaプロジェクトを進めていますワークステーション。 WindowsとOS Xの両方のソフトウェアは、圧縮されたzipファイルとして保存され、プロジェクトがエクスポートされた場合に圧縮されません。私の問題は、Windows上でOS Xアプリケーションを解凍すると、バンドルされたフレームワーク内のシンボリックリンクが壊れることです。これにより、アプリケーションの署名が破損し、OS Xでアプリケーションを起動するときに問題が発生します。Windowsファイルシステム上でunixシンボリックリンクファイルを処理する

私はApache Commons圧縮ライブラリを使用してパッケージの圧縮を解除しています。これによりシンボリックリンクとそのターゲットを検出できます。 OS Xでは、java.nio.file.Filesのメソッドを使ってシンボリックリンクを再作成することができますが、Windowsでは管理者権限が必要になります。これは、ソフトウェアを使用するための前提条件として追加することを躊躇しています(有効になっていても、私はこれがうまくいくとは確信していません。

私はリンクが壊れている理由を少しは理解していますが、私が正しく理解していれば、ファイルタイプがUnixシンボリックリンクのファイルタイプをサポートしていないため、リンクは通常のファイルOS Xで開くとシンボリックリンクとして認識されなくなるでしょう。

私の質問は、シンボリックリンクファイルをWindowsファイルシステムにビット単位でコピーするか、この情報を完全に保持しているかということです不可能?または、エクスポート方法を変更して既存のzipファイルにプロジェクトファイルを追加するだけで、シンボリックリンクの情報がターゲットマシン上で抽出されるまで保存される可能性があります。

ZipFileの各ZipArchiveEntryをループ現在のコードは以下の通りです:

byte data[] = new byte[BUFFER]; 

Enumeration<ZipArchiveEntry> entries = zipFile.getEntries(); 

while (entries.hasMoreElements()) { 
    ZipArchiveEntry zipEntry = entries.nextElement(); 
    String destFilename = copyFolder + zipEntry.getName(); 
    File destFile = new File(destFilename); 

    if (zipEntry.isUnixSymlink()) {    
     File target = new File(zipFile.getUnixSymlink(zipEntry));    
     try { 
      // Try to create symbolic link - currently only works with OS X 
      Files.createSymbolicLink(destFile.toPath(), target.toPath()); 
      continue; 
     } catch (Exception e) { 
      System.out.println("Failed to create symbolic link: " + 
       destFile.getAbsolutePath() + " -> " + 
       target.getAbsolutePath()); 
     } 
    } 

    // If file 
    int count; 
    FileOutputStream fos = new FileOutputStream(destFile); 

    try (BufferedOutputStream dest = new BufferedOutputStream(fos, BUFFER)) { 
     InputStream is = zipFile.getInputStream(zipEntry); 
     while ((count = is.read(data, 0, BUFFER)) != -1) { 
      dest.write(data, 0, count); 
     } 
    } 
} 
+0

WindowsでZIPを圧縮していないデバイスや、そのデバイスを後でMacに転送する方法など、これが使用されているワークフローについてもう少し詳しく教えてください。 Windowsでは、NTFSファイルシステムだけがシンボリックリンクをサポートしていて、FAT32はサポートしていないので、私は混乱します.WIPキーをWindowsマシン上でUSBキーにアンパックすると、USBキーがFATでフォーマットされているとシンボリックリンクが失われます。 NTFSでフォーマットされている場合、Macは(デフォルトで)それを読み取ることができません。 また、ディレクトリは任意のユーザがシンボリックリンクすることができます。ファイルをシンボリックリンクするには管理者権限のみが必要です。 – mihi

+0

また、Windowsエクスプローラでファイル/シンボリックリンクをコピーすると、関連するファイルシステムに関係なく(NTFSからNTFSになっていても)コピーはシンボリックリンクされません。 – mihi

+0

1)データを表示するソフトウェア(OS XおよびWindows版)をエクスポートする前に解凍します 2)エクスポートされたデータが表示ソフトウェアの隣に保存されます 3)全体が再びzipファイルに圧縮され、 FTPサーバーに送信されます。パッケージをダウンロードする方法についての説明は、電子メール と問題: で受信者に送信されます。4)OS XアプリケーションがWindowsで解凍→圧縮プロセス中に壊れてしまったため、OS Xのユーザーがソフトウェアを表示できません。 – pnkkr

答えて

3

Windowsファイルシステムは、シンボリックリンクは(ハードまたはソフトリンクのような)であるかを定義するためにUNIXと同様のアプローチを使用していますが、彼ら100%互換性がありません。あなたはここでそれについてもっと読むことができます:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365680(v=vs.85).aspx あなたには簡単な答えがあります。Windows NTFSには、Unix固有のビットが同じであるために、リンクをビット単位でコピーするだけでは問題ありません。 JAVAはサンドボックス内でも動作するように設計されているため、「あなたが望むものを」作成するためにシステムの低レベルAPIにアクセスする必要はありません。私は、JAVAを使ってそのようなシステム特有のタスクを行っていません。おそらくあなたはする必要はありません。

このプロジェクトでのあなたの役割によって、どのバンドルに含めるべきかを再定義することができます。本当にシンボリックリンクが必要ですか?別の部分を一緒にマップする「プロパティ」ファイルをいくつか用意するのはもっと普遍的かもしれませんか?またはデータベースとして配布しますか?システム固有の実現に頼らないようにしてください。

+0

この場合、バンドルにシンボリックリンクを含めるべきかどうかを決めるのではなく、バンドルされたフレームワークを使ってリンゴを使う方法です。 https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPFrameworks/Concepts/FrameworkAnatomy.html お寄せいただきありがとうございます。 :) – pnkkr

+0

プロパティファイルは良いアイデアであり、アプリケーションをクロスプラットフォームにしたい場合に行うべきことです。アップルの方法は明らかにアップル専用です... リンクの作成に失敗した場合は、プロパティファイルを使用できますか? – Matthieu

3

この問題を解決するには、Windows固有の "非標準"(Javaの場合は少なくとも)のアプローチが必要です。これは、クロスプラットフォームのJava標準の方法で解決できないためです。たとえば、"mklink" utilityへのコールの横にRuntime.execを使用してみることができます。 "mklink"コマンドはハードとソフトの(シンボリック)リンクの作成とジャンクションの作成を可能にします - 基本的に、Windowsファイルシステムで使用できるさまざまなタイプの再解析ポイントを作成します。ネイティブコードにアクセスする場合は、あらかじめ作成されたJNA mapping to Kernel32.dllまたはwrite a custom mapping to Kernel32.dllを使用し、WinBase.hの方法CreateSymbolicLink(LPTSTR,LPTSTR,DWORD)を使用することもできます。

1

一般に、可能であれば、Windowsではシンボリックリンクやハードリンクを避けるようお勧めします。

シンボリックリンクとハードリンクはかなり遅れてWindowsに導入されている、そしてそれに対するサポートはかなり貧弱です:

  • ほとんどのWindowsユーザーは
  • シンボリックリンクだけでローカルにサポートされ、そのファイルシステムでのシンボリックリンクを期待していませんNTFSファイルシステムで、他のファイルシステム(FAT、exFAT、UDF)やネットワーク共有を経由しないでください。
  • サードパーティ製のツール(Zipper、バックアップツール、クラウド同期ソフトウェア)およびMicrosoftソフトウェア(ファイルバージョン履歴、Windows '' Time Machine ''、またはフォルダをコピー/移動する際のWindowsエクスプローラ)はsymに対処できませんリンクまたはハードリンク、それらを解決するか、エラーメッセージをクラッシュする/表示する)。
  • 権限が
(Windows 7で、通常のユーザーは、自分がアクセスできるディレクトリにシンボリックリンク(ジャンクション)を作成することができますが、Windows XP上であなたはどのような場合でも管理者権限が必要です)Windowsのバージョンによって異なり、それらを作成するために必要な

したがって、シンボリックリンクが一時的にしか必要ではなく(コメントに書いたように)、後でファイルを再度圧縮すると、シンボリックリンクを示すために独自のマーカーファイルを作成し、それらをZIPファイルの適切なUNIXシンボリックリンクに戻します。

関連する問題