Probleme mit Zugriffsrechten bei TextOutputStream

Hallo in die Runde.
Ich habe hier den Fall, dass ich auf eine Datei zugreife, deren Prad der Anwender einstellen kann. Jetzt hat ein Anwender offenbar einen Pfad genutzt, zu dem er keine Schreibrechte hat und bekommt eine Fehlermeldung.
Ich habe das hier mal nachgestellt, indem ich den Pfad auf “SSD:Library:Preferences.” eingestellt habe und die Datei dothin kopierte (mit Adminrechten).
Der Zugriff erfolgt nun so:
t = TextOutputStream.Create(Datei)

Dort bekomme ich nun eine Fehlermeldung IOExeption Fehler -5000

Ich würde das gern schon im Vorfeld klären. Leider kann ich am Folderitem von Datei das offenbar nicht erkennen (IsWritable=true).
Wie kann ich das Problem frühzeitig erkennen und darauf reagieren?

Gruß, Stefan Mettenbrink.

Hat keiner eine Idee, wie man prüfen kann, ob der Anwender/die App Schreibreiche für die Dtaei hat?

Muss ich das für alle Parent-Directorys (bis zum Rootdirectory) klären?

Wie kommt denn der User zu dem Pfad, wenn er keine Schreibrechte drauf hat?

Die einfachste Lösung ist ein Try/Catch mit einer Fehlermeldung, daß der Ordner nicht geschrieben werden kann.

Der Anwender gibt diverse Pfade vor, an denen er Dateien ablegt. In diesem Fall hat der die zugehörige Datei einfach mit in den Progammordner kopiert.
Das ist zum Teil auch mein Fehler, weil ich seinerzeit (als REALBasic noch Windowsprogramme erzeugte, die nur aus der EXE-Datei bestanden) diese für die Nutzung vom USB-Stick aus “beworben” habe. Da sollten alle Dateien in denselben Ordner und das Programm hat sie dort erwartet.

Inzwischen kopiere ich sie dann in den App-Data Ordner.

Wie meinst Du das it Try/Catch?

try t = TextOutputStream.Create(Datei) catch err as OutOfBoundException msgbox "Böser User" end try

Na, genau soetwas suche ich doch :smiley:

Bei mir kommt halt: IOExeption Fehler -5000

Müsste sich doch wohl anpassen lassen. Mal sehen, ob ich in den nächsten Tagen dazu komme.

Danke.

Hallo,
eine andere Möglichkeit ist, beim Auswählen des Speicherordners dessen „IsWriteable“-Eigenschaft zu testen. Weiter unten eine Beispielfunktion:

Function Folder_Select() As FolderItem
  
  Dim dlg as New SelectFolderDialog
  Dim f as FolderItem
  
  dlg.ActionButtonCaption = "Auswählen"
  dlg.Title = "Speicherordner auswählen"
  dlg.PromptText = "Wählen Sie den Speicherordner aus"
  
  
  dlg.InitialDirectory = SpecialFolder.Desktop
  
  f = dlg.ShowModalWithin(Self)
  
  If (f = Nil) then
    MsgBox("f = Nil")
    Return(nil)
  end if
  
  if (f.exists = FALSE) then
    MsgBox("f.exists = FALSE")
   Return(nil)
  end if
  
  if (f.IsWriteable = FALSE) then
    MsgBox("f.IsWriteable = FALSE")
    Return(nil)
  end if
  
 Return(f)

End Function

Ich hatte auch schon überlegt, ob ich bei der Pfadauswahl bereits prüfe.
Allerdings vermute ich, dass man z. B. im Programme-Ordner als Anwender einen Ordner anlegen kann (mit eingabe des Adminpasswortes) und ich dann nicht die Rechte des übergeordneten Programme-Ordners prüfe.

Ich muss mir das mal in Ruhe ansehen und durchtesten.

Danke für den Beispielcode.

[quote=329571:@Stefan Mettenbrink]Na, genau soetwas suche ich doch :smiley:

Bei mir kommt halt: IOExeption Fehler -5000

Müsste sich doch wohl anpassen lassen. Mal sehen, ob ich in den nächsten Tagen dazu komme.

Danke.[/quote]
Am Ende der Methode ein “On Err IOException”, darunter der Abfangjäger, wie weiter oben von Beatrix W. geschrieben.

Exception err fange ich ohnehin schon ab. Dass sollte sich erweitern lassen.

Lieber wre mir gewesen, wenn man irgend einen Parameter abfragen knnte, bevor der Fehler auftritt und man den Anwender auf die fehlenden Zugriffsrechte aufmerksam machen knnte.

Ich habe inzwischen den Code wie empfohlen angepasst. Allerdings gefllt mir das Vorgehen nicht.

Hier ein Beispielprojekt:
http://www.familienbande-genealogie.de/Test/toe.zip

Vorbereitend eine beliebige Datei ins Rootverzeichnis des Systemlaufwerkes kopieren (dort hat man als Anwender keine Zugriffsrechte).
Beim Start der Demo wird eine Dateiauswahl geffnet, in der man die zuvor ins Root-Verzeichnis kopierte Datei auswhlt.

Hier der Code im Open-Event:
[i]Dim dlg as OpenDialog
Dim f as FolderItem
dim t as TextOutputStream
dim pos as integer

dlg=New OpenDialog
#If Not (TargetLinux) then
dlg.InitialDirectory=SpecialFolder.Documents
#Else //open Home directory on linux
dlg.InitialDirectory=SpecialFolder.Home
#endif
dlg.Title=“Select a file”
'dlg.Filter=FileTypes1.mif //Defined as file type in FileTypes1.
f=dlg.ShowModal()
If f <> Nil then
if f.Locked=false then
pos=1
t = TextOutputStream.Create(f)
pos=2
if t<>nil then
pos=3
t.Close
MsgBox “TextOutputStream is writable”
end
else
MsgBox “File locked”
end

Else
MsgBox “User Cancelled”
End if

Exception err
if pos=1 then
MsgBox “access denied (”+str(pos)+")"
else
MsgBox str(pos)
end[/i]

Im Code prfe ich vor Nutzung von TextOutputStream, ob das Foderitem existiert und ob es schreibgeschtzt ist. All das hilft nichts, ich bekomme beim Zugriff per TextOutputStream eine Exception. Klar kann ich die abfangen (wie im Code zu sehen), ich wrde aber lieber bereits vorher das Folderitem prfen, ob hier TextOutputStream berhaupt mglich ist.

Gibt es da tatschlich nichts?

Ich wrde mir dann eine Methode anlegen, der ich das Folderitem bergebe und dort den Textoutputstream versuchen. Dann knnte ich im Fehlerfall ein False zurckliefern.

Allerdings wird die Datei bereits bei TextOutputStream.Create(f) gelscht (Gre = 0 Bytes), wenn ich Zuriffsrechte habe. Ich wei nicht, ob das immer gewnscht ist.

So richtig gefallen mchte mir das alles nicht.

Hat noch jemand eine Idee?

Hallo,
eventuell eine kleine Verbesserungsidee:
Hinter f=dlg.ShowModal()
zustzlich noch diese Abfrage einfgen:

[code]
If (f = Nil) then
Return
end if

if f.Parent.IsWriteable = FALSE then
MsgBox(“You dont have permission to write to the folder that the selected file is in.”)
Return
end if[/code]

Edit: Check fr f = Nil ergnzt.

[quote]eventuell eine kleine Verbesserungsidee:
Hinter f=dlg.ShowModal()
zustzlich noch diese Abfrage einfgen:[/quote]

Hilft nicht.
Der Ordner Librarys im Rootverzeichnis ist nicht schreibgeschtzt (IsWritable=true), dennoch habe ich dort as reiner Anwender keine Schreibrechte.
IsWritable = schreibgeschtzt, die Rechte kann ich anscheinend nicht abfragen :frowning:

Sorry, dann wei ich nicht weiter.
Bei mir funktioniert es auf diese Art, d.h. ich erhalte ich fr das Parent der Test-Datei (die ich nach /Library/Preferences kopiert habe) die Eigenschaft IsWriteable = FALSE. Beim Auswhlen der Test-Datei erscheint dann die MessageBox mit den Hinweis, dass ich fr diesen Ordner keine Schreibrechte habe.

Ich muss mich korrigieren. Irgendwie habe ich nicht richtig hingesehen. Das Parent-Object ist tatschlich schreibgeschtzt (IsWritable=false).
Ich habe auch mal einen Ordner in /Library/Preferences angelegt (mit eingabe des Adminkennwortes) und dort eine Testdatei deponiert. Darauf konnte ich dann problemlos zugreifen.

Dein Hinweis scheint also tatschlich zu funktionieren. Danke.