Desidero sapere se l'utente ha lanciato la nostra applicazione basata su Java da un file system di sola lettura come da un dmg, quindi funzioni come auto- l'aggiornamento sarà in grado di mostrare informazioni significative invece di abortire con un errore. Prima pensavo che controllare il percorso di .app sarebbe stato sufficiente (quando lanciato da un file .dmg è qualcosa come /Volumes/MyApp 1.2.3/MyApp.app
, ma questo non funzionerà, perché l'utente potrebbe aver installato l'applicazione su una partizione diversa. ?Rilevare se un'applicazione è stata avviata da un file system di sola lettura su OS X
risposta
È anche possibile controllare direttamente da Java se un certo percorso punti a qualcosa all'interno di una directory di sola lettura interrogando il FileStore
associato al tuo percorso:
File classpathRoot = new File(MyClass.class.getClassLoader().getResource("").getPath());
/* getPath() actually returns a String instead of a Path object,
* so we need to take this little detour */
Path yourAppPath = classpathRoot.toPath();
boolean isReadOnly = Files.getFileStore(yourAppPath).isReadOnly();
Se OSX è conforme a POSIX, per determinare se il filesystem è montato R/o, è possibile utilizzare statvfs()
o fstatvfs()
, tornato struct statvfs
campo f_flag
dovrebbe avere ST_RDONLY
bit impostato per R/o del file system.
Come era indicato nei commenti, controllare se questa informazione è correttamente fornita dal sistema operativo
JNA e this possono essere utili per Java.
Un paio di idee, che possono essere utile here (access()
, open()
, utime()
).
È possibile utilizzare anche lo specifico OS X statfs()
, ma questa funzione non è portabile (Linux e * BSD hanno funzioni statfs()
leggermente diverse).
In realtà, essendo conforme a POSIX ** non ** significa che si può usare 'statvfs()' per sapere se un file system è di sola lettura. La [man page] (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/statvfs.3.html) dice che POSIX in realtà non richiede che queste funzioni facciano * qualsiasi cosa * e che non dovrebbero essere utilizzati da app portatili. Dato che la domanda era specifica per OS X, si potrebbe usarli in questo caso, ma la tua implicazione sul fatto che si possa usarli su qualsiasi sistema operativo conforme a POSIX non è corretta. –
@KenThomases, http://pubs.opengroup.org/onlinepubs/9699919799/functions/statvfs.html dice "Problema 7" queste funzioni vengono spostate in ** Base ** da ** XSI **, quindi come capire che non sono più opzionali per il sistema conformat POSIX. – kestasx
Dal tuo link "Non è specificato se tutti i membri della struttura statvfs abbiano valori significativi su tutti i file system". Le funzioni fanno parte dello standard Base, ma non sono obbligate a ** fare nulla **. –
È possibile utilizzare -[NSURL getResourceValue:forKey:error:]
con la chiave NSURLVolumeIsReadOnlyKey
. Lo applicheresti all'URL del pacchetto dell'app restituito da [[NSBundle mainBundle] bundleURL]
. Quindi:
NSBundle* bundle = [NSBundle mainBundle];
NSURL* bundleURL = bundle.bundleURL;
NSNumber* readOnly;
NSError* error;
if ([bundleURL getResourceValue:&readOnly forKey:NSURLVolumeIsReadOnlyKey error:&error])
{
BOOL isReadOnly = [readOnly boolValue];
// act on isReadOnly value
}
else
{
// Handle error
}
Potresti suddividere le chiamate in metodi separati, quindi è più facile per me replicare da Java usando SWT? Grazie in anticipo. –
Ho modificato la mia risposta. E 'questo che intendevi? –
- 1. Come rilevare se un'applicazione OS X è già stata avviata
- 2. Android - File system di sola lettura IOException
- 3. La mia app per Android può rilevare se è stata avviata da Eclipse?
- 4. Apre un file come modalità di sola lettura su windows
- 5. Cercando di creare un file in Android: aperta fallita: EROFS (file system di sola lettura)
- 6. C# crea file di lettura/scrittura da sola lettura
- 7. Determinare se l'applicazione iOS è stata avviata tramite Siri
- 8. L'applicazione non è stata avviata correttamente (0xc000007b)
- 9. Come rilevare 'Salva come PDF ...' è stato scelto da un AWT PrinterJob su OS X
- 10. L'applicazione non è stata avviata in tempo
- 11. Apri file di sola lettura
- 12. Come creare un file di "sola lettura"?
- 13. Come rilevare che l'app WP8.1 è stata avviata su Windows 10 Mobile?
- 14. La mia applicazione è stata avviata manualmente?
- 15. L'associazione file Mac OS X funziona, ma l'icona del file non è stata modificata
- 16. Come ottenere l'oggetto View su cui è stata avviata l'animazione ......?
- 17. CoreOS: file di sola lettura sistema
- 18. Come rilevare se una pagina Web è in esecuzione da un sito Web o da un file system locale
- 19. Watcher di file system cross platform (Linux/OS X) (comando di marcia quando il file cambia)
- 20. Sonarqube Webapp non è stata avviata
- 21. Come rilevare SSD in Mac OS X?
- 22. Rileva che un'applicazione è stata avviata nello stato di sfondo?
- 23. Divisione di un file tramite AWK su Mac OS X
- 24. Stampa da mono su OS X
- 25. nomi delle colonne di lettura sola in un file CSV
- 26. Miglior modo POSIX per determinare se un filesystem è montato sola lettura
- 27. Verificare se il file è di sola lettura e modificare il file batch di Windows
- 28. Java: il file di spunta è di sola lettura
- 29. Tubi denominati nella cartella contenitore docker montata su mac os x file system tramite boot2docker
- 30. Autorizzazioni XAMPP su Mac OS X?
Che cosa è esattamente la tua definizione di sola lettura? Cosa succede se il filesystem è scrivibile, ma l'utente non ha le autorizzazioni per modificare il pacchetto dell'app? Questo si qualificherebbe? – NPE
No, perché l'applicazione può richiedere le autorizzazioni. –