|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
[JAVA] Permessi di accesso a file in Vista
allora...ho finito la mia bella applicazione che lavora con i file, ma qualndo al eseguo (post offuscamento) su XP tutto bene, su Vista NO, ovvero non mi salva i file.
credo(suppongo, visto che non ho sorgenti e non posso verificare) che sia un problema di accesso ai file. se è così qualcuno può suggerirmi su come risolverlo? grazieeeee P.S.: è possibile cambiare icona al mio jar??? (intendo l'icona che appare sul desk non quella in altro a sinistra
__________________
My gaming placement |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
"hai finito la tua bella applicazione" e "non ne hai i sorgenti per verificare"?
![]() comunque, nel caso si trattasse effettivamente di problemi di permessi su file, queste sono le domande cruciali: 1) devi distribuire la tua applicazione? se no basta che cambi i permessi sul tuo PC. 2) per quale motivo stai cercando di scrivere in cartelle dove non puoi scrivere? i permessi dei files e delle directories su Vista non é che siano impostati a culo. |
|
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
Quote:
quindi la domanda è per mettere le mani avanti, così domani arrivo e sò cosa cercare Quote:
Quote:
con un installer io creo la struttura ad albero del mio programma, e poi all'interno di queste cartelle faccio delle operazioni. una delle operazioni è "scrivere sul file". quindi le cartelle non sono quelle di sistema (non voglio distruggere niente X_X) ma sono delle sottocartelle "mie". ora che ci penso però...posso avviare il programma da console e vedere se genera qualche errore. a volte mi perdo in un bicchiere mezzopieno d'acqua
__________________
My gaming placement |
|||
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
comunque solitamente la soluzione a questo fastidiosissimo problema di Java consiste semplicemente nell'installare il programma in una cartella su cui hai pieno accesso, per esempio una sottocartella dei documenti. |
||
|
|
|
|
|
#5 | ||
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
Quote:
Quote:
__________________
My gaming placement |
||
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
allora, sono qui per "cercare" la soluzione (per vista per il momento...poi mi installo seven e vediamo).
il problema è questo: Codice:
java.io.FileNotFoundException: data\cliente.ktm (Accesso negato)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileOutputStream.<init>(Unknown Source)
at saving.ArchivioClienti.salvaClienti(Unknown Source)
at saving.ArchivioClienti.caricaClienti(Unknown Source)
at graphic.I.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown
Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
la mia domanda è....basta che quei file che utilizzo li salvo in "C:\dcocumenti\programmamio\miofile" oppure c'è qualche soluzione più elegeante?
__________________
My gaming placement |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Domandina scema
Se hai creato un installer, su Vista, non è che ti basterebbe lanciarlo con esegui come amministratore ?!?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
boh...non ci capisco niente...e non ho un pc conqvista qui...quindi quando lo provo su vista non ho il sorgente..e quando ho il sorgente non ho vista -.-
__________________
My gaming placement |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
ho aperto un thread ma avevo scordato di avere questo.
comunqu sono stesso problema
__________________
My gaming placement |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Per uno che sa usare Java trovare la cartella APPDATA è difficile quanto tagliarsi le unghie.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
ora dimmi quanto ridi se ti dico che ho le unghie dei piedi incarniti per problemi avvenuti al taglio???
__________________
My gaming placement |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
ok, mai usati.
cerco su google qualcosa al riguardo, se nel frattempo puoi indirizzarmi tu...
__________________
My gaming placement |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Premetto che non conosco nulla delle API di windows e il fatto che io sia riuscito ad ottenere il percorso di APPDIR in 5 minuti netti da una misura della difficoltà del problema.
Uno va a guardare come si fa ad ottenere la cartella APPDIR nelle API di Windows e, stando a google, risultano quattro linee di codice C/C++: ITEMIDLIST* list; char appdir[500]; SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &list); SHGetPathFromIDList(list, appdir); A questo punto appdir contiene la cartella APPDATA. Ora, Java ha questo straordinario e apparentemente ignoto pezzo di sè chiamato JNI. Diciamo che vogliamo copiare appdir in uno StringBuilder. Giusto per vedere. Bene, supponendo che questo StringBuilder sia creato in Java ci troviamo con; jobject stringBuilder; //lo StringBuilder: tutti i reference JNI sono jobject salvo un paio Diciamo che vogliamo riempire lo stringBuilder un carattere alla volta. StringBuilder ha il metodo append(char). Usiamo questo. Prima prendiamo il metodo: jclass stringBuilderClass = env->FindClass("java/lang/StringBuilder"); jmethodID appendChar = env->GetMethodID(stringBuilderClass, "append", "(C)Ljava/lang/StringBuilder;"); poi lo invochiamo. Vogliamo dire "per ogni carattere in appdir finchè ce ne sono stringBuilder.append(c)?". Scriviamo: Codice:
for(int i = 0; (i < 500) & (appdir[i] != '\0'); i++) {
env->CallVoidMethod(stringBuilder, appendChar, appdir[i]);
}
Questo tanto per dare un'idea dell'invocazione di metodi e di come appaiono gli oggetti JNI. Passiamo al nostro problema. Voglio ottenere la cartella "APPDATA". 1. Creo una classe Java con un metodo nativo (i nomi sono arbitrari): Codice:
package it.tukano.winapi;
public class WinApi {
public native String getAppDir();
}
javac -d . *.java Poi creo l'header JNI: javah it.tukano.winapi.WinApi L'header contiene il prototipo della funzione JNI che rappresenta la controparte nativa di getAppDir, cioè la funzione che sarà invocata ogni volta che io dirò: winApi.getAppDir(); Il prototipo è un po' strano a vedersi ma è al 99% convenzionale. L'unica cosa da notare è che il metodo nativo getAppDir() è senza argomenti e restituisce uno String, la controparte nativa restituisce un jstring e ha due argomenti. JNIEnv è il puntatore alle funzioni globali di JNI, jobject è un riferimento al "this" dell'invocazione Java. Comunque la definizione di quella funzione è brevissima: Codice:
//file dllmain.cpp
#include "it_tukano_winapi_WinApi.h"
#include <shlobj.h>
JNIEXPORT jstring JNICALL Java_it_tukano_winapi_WinApi_getAppDir
(JNIEnv *env, jobject obj)
{
int SIZE = 500;
char buffer[SIZE];
ITEMIDLIST* list;
SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &list);
SHGetPathFromIDList(list, buffer);
return env->NewStringUTF(buffer);
}
Compilando con il tuo ide c++ottieni la tua dll. Per usare il tuo WinApi dirai: Codice:
public class Main {
public static void main(String[] args) {
System.loadLibrary("winapi");
it.tukano.winapi.WinApi winApi = new it.tukano.winapi.WinApi();
System.out.println(winApi.getAppDir());
}
}
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
asd....grazie mille.
provo e vi faccio sapere
__________________
My gaming placement |
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
c'é sempre il dubbio che un'intera DLL sia overkilling per chiamare una sola API; la possibilitá che esiste in C# di invocare direttamente l'API ad esempio toglierebbe l'imbarazzo.
tra l'altro un programmatore che sappia usare Java raramente sa usare anche il C++ e men che mai le API Win32, di conseguenza il problema non é cosi semplice come tagliarsi le unghie, specialmente se per risolverlo ricorre a chissá quali minchiate trovate su Google; il tuo codice ad esempio é semi-delirante, avresti dovuto scrivere una cosa del genere: Codice:
CHAR szBuffer[MAX_PATH];
HRESULT hr = SHGetFolderPathA(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, szBuffer);
if (FAILED(hr) || (hr == S_FALSE))
{
// gestire l'errore
}
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ho incollato la prima cosa che ho trovato, premettendo a bella posta che non conosco le API di windows. Se io dovessi fare qualcosa di specifico per Windows probabilmente mi prenderei un bel libro e me lo leggerei. Ma google va benissimo: in effetti verificando su MSDN si sarebbe scoperto che la funzione che ho trovato io è stata sostituita da SHGetFolderLocation.
Io sono dell'idea che un programmatore per il fatto di essere tale debba essere in grado di usare C++ esattamente quanto è in grado di usare Java o un qualsiasi altro linguaggio. Altrimenti resti lì in mutande ogni volta che non trovi una funzione nelle api standard, il che è francamente inaccettabile. Una libreria dinamica per una funzione non è più eccessivo che cambiare interamente piattaforma per quell'unica funzione. Specialmente se l'alternativa è C#.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me! |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
allora, ho fatot le seguenti cose:
1) scaricato devc++ 2) creato il file java Codice:
package it.tucano.winapi;
public class WinApi {
public native String getAppDir();
}
4) aperto devc++ e creato un nuovo progetto ddl 5) nuovo file cpp chiamato dllmain.cpp 6) copiato il codice di pgi Codice:
//file dllmain.cpp
#include "it_tucano_winapi_WinApi.h"
#include <shlobj.h>
JNIEXPORT jstring JNICALL Java_it_tucano_winapi_WinApi_getAppDir
(JNIEnv *env, jobject obj)
{
int SIZE = 500;
char buffer[SIZE];
ITEMIDLIST* list;
SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &list);
SHGetPathFromIDList(list, buffer);
return env->NewStringUTF(buffer);
}
7) compilo con dev e mi dà questo errore: Quote:
se ho capito bene il file generato da me (it_tucano_winapi_WinApi.h) non si collega alla libreria jni.h la mia domanda è: dove trovo questa libreria?
__________________
My gaming placement |
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: May 2005
Città: Roma
Messaggi: 7938
|
questa parte risolta così
Quote:
__________________
My gaming placement |
|
|
|
|
|
|
#20 | ||||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
inoltre, essendo tu un programmatore Java e non C++, non sei abituato all'idea di dover liberare le risorse che allochi e quindi non hai chiamato la CoTaskMemFree per liberare il puntatore restituito da SHGetSpecialFolderLocation (si, un leak ripeto che per un programmatore che sa usare Java non é necessariamente* una questione di pochi secondi evitare di creare la solita applicazione ottusa che mette i dati nel suo stesso ramo di directories e quindi non é compatibile con Vista e futuri, mentre invece lo sarebbe se Java offrisse un modo semplice per conoscere i well-known path del sistema senza scendere a livello nativo. * "non necessariamente" nel senso che esistono anche programmatori contemporaneamente esperti in Java e C++, e questi invece si spera che siano in grado. Quote:
Quote:
io non é che posso mettermi a scrivere una DLL JNI tutte le volte che devo fare un programma Java che deve girare anche su Windows (perché poi come la mettiamo quando il programma deve girare non solo su Windows? non prendiamoci in giro, la libreria nativa per un compito cosi idiota é un giro della Madonna, anche come curva d'apprendimento non c'é paragone con un'alternativa piu semplice come un metodo o una property che restituiscono il path richiesto). Quote:
Ultima modifica di fero86 : 20-07-2009 alle 15:24. |
||||
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:38.





















