問題タブ [diskarbitration]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - OSX-Mounting DVD がプログラムによってユーザー指定のアプリケーションを起動しない
さまざまなドライブとディスクを管理するために、ディスク調停フレームワークを使用しました。
コールバック関数DADiskAppearedCallback
とを登録しDADiskDisappearCallback
ました。
USB ドライブの場合はすべて問題なく動作しているように見えますが、CD/DVD の場合は問題に直面しています。
CD/DVD がロードされた後DADiskUnmount()
、ディスクの BSDName を使用してドライブをアンマウント () しました。次に、ディスクを確認した後、DADiskMount()
BSDName を使用してディスクを再度マウント () します。
CD/DVD を再度マウントすると、
システム設定 -> ハードウェア -> Cds & DVS
起動していません。
たとえば。ビデオ DVD の場合 - DVD プレーヤーを開きます。ここで DVD プレーヤーが起動します。
この問題を解決するにはどうすればよいですか?
「SystemUIServer」は、CD/DVD の挿入時にマウントする必要があるアプリケーションを管理します。CD/DVD マウントでそのアクションをトリガーできますか? または、CD/DVD マウントでユーザー提供のアプリケーションを手動で起動するこの適切な方法はありますか?
objective-c - NSArray を CFStringRef に変換 *
NSArrayをDADiskMountWithArgumentsの引数オプションと互換性のあるヌル終了リストに変換する方法が必要です。
ドキュメントでは、引数オプションがタイプの「ヌル終了リスト」になるように指定していますCFStringRef arguments[]
。
引数とともにNSArrayを渡したい Mount メソッドを作成しました。このメソッドでは、 NSArrayを CFStringRef * に変換する必要があります。
私は自分で試してみましたが、常にARCで問題が発生し、これを行う良い方法をまだ見つけることができませんでした.
インスピレーションを得るために、GitHub のプロジェクト Disk-Arbitrator https://github.com/aburgh/Disk-Arbitrator/blob/master/Source/Disk.mを調べましたが、そのアプリケーションの作成者は次の方法を使用しています。
しかし、それは ARC では許可されておらず、それを行う方法が見つかりません。
より明確にするために更新します。
この行:
次のエラー メッセージが表示されます。
ARC では、Objective-C 以外のポインター型 'void *' から '__strong id *' への暗黙的な変換は許可されていません
明示的な所有権のない非 const 型 'id' へのポインター。
それを修正するために、私はこれをやろうとしています:
次に、この行:
次のエラーが発生します。
[エラー] ARC では、Objective-C ポインターの '__unsafe_unretained id *' への暗黙的な変換は許可されていません
[警告] '__string id' を '__unsafe_unretained id *' 型のパラメーターに送信する互換性のないポインター型
-getObjects:range:の宣言は次のようになります。
だから私が得たエラーメッセージから、「__unsafe_unretained id *」を「getObjects:(id [])aBuffer」に渡す必要があると思います。そのため、ID を __unsafe_unretained として宣言することを修正するには、次のようにします。
そして、この行を次のように更新します。
今はエラーはありませんが、DADiskMountWithArgumentsの呼び出しで次のエラーが発生します。
Objective-C ポインターの「CFStringRef *」(別名「const struct __CFString **)」へのキャストは、ARC では許可されていません
そのため、このエラーを修正できなかったため、ここで行き詰まりました。以前に間違いを犯したのか、それとも CFStringRef を送信する正しい方法が見つからなかったのかがわからないため、ここでガイダンスを求めることにしました。
これはコンテキストでどのように見えるかです。ここで、args は以前に宣言されたNSArrayです。
したがって、私の質問は、このメソッドを ARC フレンドリーにするにはどうすればよいか、またはNSArrayから NULL で終了する CFStringRef を取得するための別の/より良い方法があるかということです *
objective-c - コールバック メソッドでディスクを列挙しているときに DiskRef が消える
私が取り組んでいるプロジェクトで、GitHubのプロジェクトDisk-Arbitratorの DiskArbitration クラスを使用しました。
OS X インストーラー ディスク イメージをマウント/アンマウントしています。また、列挙中にディスク リストが変更され、渡された diskref が になるhdiutil
ため、コールバック メソッドが定義されている場合もあります。DARegisterDiskDescriptionChangedCallback
NULL
コールバックのために呼び出される関数は次のとおりです。
コピーを作成して列挙することで、列挙中に変異するという問題を解決しました。
ただし、このコードは次のようにクラッシュすることがあります。"*** CFHash() called with NULL ***"
これは、ディスクが消失し、diskRef
おそらく割り当てが解除されたためです。
だから、ここでいくつかのヒントが必要です。のコピーを試してみたかったので、次のようにして試しdiskRef
ました。
しかし、それもうまくいきませんでした。コピーを作成する別の方法はありますか?または、これにアプローチする必要がある別の方法がありますか。
objective-c - DiskArbitration を使用して OSX でディスクをアンマウントする
OSX でディスクをアンマウントしようとしています。コードは正常に動作しますが、エラーが発生した場合にのみ、ディスクが正常にアンマウントされたときにコールバックが呼び出されません。DiskArbitrationProgGuide を読み、手順に従いましたが、まだ進展がありません。誰か助けてくれませんか?
更新中。Ken Thomases のおかげで、コードが動作するようになりました
cocoa - イジェクトせずにドライブ/ボリュームをアンマウントする
イジェクトせずにディスクをアンマウントしたいです。そのために、次のコードを試しました
このコードはこの質問からのものです。 @zeFree に感謝します
それは機能していますが、コードのように静的なボリュームへの動的パスが必要です。NSString を CFStringRef に変更してから、path("/volumes/Untitled") の場所で使用しようとしましたが、それでも同じです。
どんな提案でも大歓迎です。
macos - Mac App Sandbox と USB デバイスのアンマウント
サンドボックス アプリケーションの Objective-C 内で USB デバイスをアンマウントする必要があります。
アンマウントには、次を使用します。
DiskArbitration から。
サンドボックスを有効にするまで、すべて正常に動作します。サンドボックスを使用すると、アンマウント (DiskUnmountCallback) が失敗を返します。
デバイスのマウント解除のサンドボックス資格設定や、その問題のその他の理由を見つけることができません。
エンタイトルメントで「com.apple.security.device.usb」を有効にしましたが、それでも USB デバイスをアンマウントできません。
macos - Thunderbolt ドライブは、ディスク アービトレーション/iokit で取り出し可能としてマークされていませんが、明らかにそうです。
ディスク調停を使用してマシンに接続されているデバイスを見つけ、接続/切断イベントに反応するアプリケーションを開発しています。これは何年もうまく機能しています。つい最近、外部 Thunderbolt ドライブを使用しているときに何かが期待どおりに機能しないことを発見し、これをデバッグして、ボリュームの取り出し可能なプロパティ (kIOMediaEjectableKey i IOKit にマップされるディスク調停の kDADiskDescriptionMediaEjectableKey) が false に設定されていることを確認しました。ただし、ドライブはイジェクト ボタン付きで表示されます。
このボリュームが取り出し可能かどうかを決定するために finder は何を使用しますか? 明らかな kDADiskDescriptionMediaEjectableKey ではありません。
ヒントをいただければ幸いです。
macos - OSX Fusion Drive の情報をプログラムで取得する
ドライブ (および で表示されるような関連する統計情報iostat
) とパーティションをマウント ポイントにリンクするプロジェクトに取り組んでいますが、OS X がFusion Driveを実行する方法に問題があります。
IO RegistryとDisk Arbitration Frameworkからドライブとパーティションに関する情報を収集できました。同様に、statfs (またはmount
またはdf
コマンド) を使用して、ドライブとマウント ポイントを関連付けることができました。ただし、Fusion Drive が写真に入るミッシング リンクがあります。の出力例を次に示しますdiskutil list
。
(読み取り/書き込み/読み取りバイト/書き込みバイト、転送に費やされた時間など)からの IORegistry 統計は、上記の出力にiostat
関連付けられています。disk0
ただし、df
(または同等のプログラムによる statfs 関数) は、/
マウント ポイントを次のように関連付け/dev/disk1
ます。
/
のファイルシステムの読み取り/書き込みを物理ドライブと関連付けることができるようにしたいと考えていますdisk0
。と関連付ける方法がないか、ここや他の場所で数時間かけて検索しましdisk1
たdisk0s2
。のソースコードdiskutil
は明らかにDiskManagement
フレームワークにあり、公開されていません。
上記のコマンドの出力をテキストで解析する以外にdiskutil list
、マウントされた (仮想) フュージョン ドライブをその基になる (物理) パーティションに関連付ける方法はありますか?