aber auch einfach gehts nicht
Bedeutet auch mit meiner Änderung nicht?
aber auch einfach gehts nicht
Bedeutet auch mit meiner Änderung nicht?
Oh moment, wurde vorhin aufgehalten, check ich gleich aus;)
2min later...
so jetzt gibbet zumindest nen Lebenszeichen, Datei konnte nicht gespeichert werden...Is doch wie verhext
Sorry, default ist bei Fileopen der Readmode, da hatte ich nun nicht dran gedacht.
Du musst also z.B. $FO_OVERWRITE als 2. Parameter beim Fileopen mitgeben.
Siehe dazu auch: https://www.autoitscript.com/autoit3/docs/f…ns/FileOpen.htm
Moin,
in diesem Fall wird die Datei ja immer komplett gelesen bzw. geschrieben. Es macht für mich deshalb nicht viel Sinn, per FileOpen() ein Dateihandle zu erzeugen, das dann doch gleich wieder geschlossen werden muss.
FileRead() und FileWrite() akzeptieren auch den Dateinamen. Das scheint mir hier die bessere Option.
Velted Ist Fileread das nicht das gleiche wie Fileopen und Fileclose?
Zitat von HilfeIf a filename is given rather than a file handle - the file will be opened and closed during the function call -
Bzgl.: Filewrite: Musste man dazu die Datei nicht auch vorher mit Fileopen (mit schreibrechten) offen haben? Kenne das nur so, da aus der Hilfe so übernommen.
Moin Moombas,
das Zitat aus Deinem lBeitrag #25 gilt meiner Meinung nach auch für FileWrite().
FileOpen() ist für mich nur da wichtig, wo wiederholt auf Teile der Datei zugegriffen werden soll oder die Codierung vom Standard abweicht.
Moin Moombas,
das Zitat aus Deinem lBeitrag #25 gilt meiner Meinung nach auch für FileWrite().
Das Könnte sein und würde Sinn machen. Da es dort jedoch nicht erwähnt wird, habe ich das bisher immer mit Fileopen gemacht.
Edit: Ich denke ich weiß warum ich es konsequent mal immer mit Fileopen gemacht habe. Um es immer gleich zu handhaben, denn:
Zitat von HilfeTo write in another mode the file must be opened with FileOpen() and the relevant flags.
BTT:
Mögliche Lösung :
;Form3 Config1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _Form3()
;local $file = FileOpen("C:\Program Files\Mozilla Firefox\confs\firefox_ext.cfg")
local Const $Filename = @ScriptDir & "\test.txt"
local $file = FileOpen($Filename)
local $Form3 = GUICreate("Subform", 450, 425, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME)) ;Creates the GUI window
; local $iEdit = GUICtrlCreateEdit(FileRead($file) & @CRLF & "Another Line", 0, 0, 500, 400, $ES_WANTRETURN + $WS_VSCROLL + $ES_AUTOVSCROLL + $ES_MULTILINE + $WS_TABSTOP)
global $iEdit = GUICtrlCreateEdit(FileRead($file), 0, 0, 500, 400, $ES_WANTRETURN + $WS_VSCROLL + $ES_AUTOVSCROLL + $ES_MULTILINE + $WS_TABSTOP)
local $hButton = GUICtrlCreateButton("Speichern", 160, 400, 107, 25, $WS_GROUP)
GUICtrlSetBkColor(-1, $SubBack)
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
GUICtrlSetLimit(-1, 0xFFFFFF)
ControlClick($Form3, "", $iEdit)
GUISetState(@SW_SHOW) ;Shows the GUI window
FileClose($file)
While 2
local $mMsg = GUIGetMsg()
Switch $mMsg
Case $GUI_EVENT_CLOSE
GUIDelete($Form3)
GUISetState(@SW_ENABLE, $Form3)
Return
Case $hButton
$file = FileOpen($Filename, $FO_OVERWRITE)
if FileWrite($Filename, GuiCtrlRead($IEdit)) then
MsgBox(0,"Fertig!","Datei wurde gespeichert!")
Else
MsgBox(0,"Fehler!","Datei konnte nicht gespeichert werden!")
Endif
;GUICtrlSetData($iEdit, FileRead($Filename)) ;Optional zur Kontrolle
FileClose($file)
EndSwitch
WEnd
EndFunc
Alles anzeigen
Zitat von FileWrite() -> RemarksIf a filename is given rather than a file handle, the file will be opened and closed during the function call.
Zitat von FileOpen()$FO_OVERWRITE (2) = Write mode (erase previous contents)
Moombas, wenn Du die Datei mit $FO_OVERWRITE öffnest, wird der anschließende Aufruf von FileRead() nicht viel finden.
Warum? Das bedeutet doch nur das die Datei komplett überschrieben wird. Warum sollte Fileopen das dann nicht finden?
Er will ja nichts anfügen, sondern komplett ersetzen, sofern ich das richtig verstanden habe.
... Aber du hast teilweise Recht. Aber ansonsten würde per Standard hinten angehängt und das ist nicht das was gewünscht ist.
Meine "Lösung" hatte jedoch einen Fehler, ist oben nun korrigiert und bestätigt meine Meinung in "Lieber mit Fileopen() und FileClose() arbeiten".
Hey cool MOombas dass Du noch dran gedacht hast, irgend wie hatte ich ja schon son Berrechtigungsding befürchtet, aber jetzt funktioniert es.
Recht herzlichen Dank, tut mir echt leid dass ich immer mit so Hammerdingern komme, dachte erst ist bestimmt eher ne simplere Geschichte, wünsche allen Helfern noch eine
angenehme Woche
Naja so ein "Hammerding" war es eigentlich nicht.
Man muss sich halt mal kurz damit beschäftigen und was die Funktionen eigentlich machen/erwarten.
Blöd ist halt manchmal wenn man sein 0815 Vorbau hat und den 1:1 in den meisten Fällen nehmen kann, dann macht man sich über solche Kleinigkeiten keinen Kopf mehr, weshalb das bei mir nun auch länger gedauert hat als nötig gewesen wäre^^
Ich habe nicht gesagt, FileOpen() würde dann nichts finden. Ich habe gesagt FileRead().
Und noch was:
Func _Form3()
local Const $Filename = @ScriptDir & "\test.txt"
local $file = FileOpen($Filename)
...
global $iEdit = GUICtrlCreateEdit(FileRead($file), 0, 0, 500, 400, $ES_WANTRETURN + $WS_VSCROLL + $ES_AUTOVSCROLL + $ES_MULTILINE + $WS_TABSTOP)
...
FileClose($file)
ist identisch mit
Func _Form3()
local Const $Filename = @ScriptDir & "\test.txt"
...
global $iEdit = GUICtrlCreateEdit(FileRead($Filename), 0, 0, 500, 400, $ES_WANTRETURN + $WS_VSCROLL + $ES_AUTOVSCROLL + $ES_MULTILINE + $WS_TABSTOP)
...
FileOpen() mit Standardwerten bringt hier keinen Vorteil, erfordert aber ein FileClose().
Case $hButton
$file = FileOpen($Filename, $FO_OVERWRITE)
If FileWrite($Filename, GuiCtrlRead($IEdit)) Then
...
Endif
FileClose($file)
sollte in der Funktion FileWrite() $file benutzen oder (wie oben) die Funktionen FileOpen() und FileClose() weglassen.
Velted: Ja, man kann das hier im ersten Teil auch mit dem "nur" Fileread lösen. Wie gesagt ich bevorzuge das überall gleich zu handhaben und casi4712 kann natürlich selber entscheiden was/wie er es nutzt. Da es im Endeffekt so oder so ausgeführt wird macht es effektiv keinen Unterschied (in der aktuellen Konstellation, wo es nur 1 mal verwendet wird).
Zudem ist das Fileclose durchaus vorhanden.
Genau der Fall funktioniert jedoch nicht. Teste es aus!
Edit: Im Einzelnen:
1. Wird das filehandle ($file) mitgeschleift und erst am Ende geschlossen, sind die Daten nicht aktuell bzw. können nicht gespeichert werden, womit diese Funktion nicht mehr gegeben ist.
2. Wird nur Filewrite genutzt, wird an das Ende der Datei der Text angehängt anstatt ihn mit dem neuen Inhalt zu ersetzen.
2. Wird nur Filewrite genutzt, wird an das Ende der Datei der Text angehängt anstatt ihn mit dem neuen Inhalt zu ersetzen.
Das hatte ich nicht mehr im Hinterkopf. FileWrite() ersetzt also das gute alte FileAppend (wie es in AutoHotkey noch immer existiert).
Es wäre nicht falsch, wenn die Hilfe-Datei darauf hinweisen würde.
Es wäre nicht falsch, wenn die Hilfe-Datei darauf hinweisen würde.
Steht doch eindeutig drin:
Zitat von AutoIt HilfeFunction FileWrite
Write text/data to the end of a previously opened file.
Ok dann bedank ich mich noch mal abschliessend, und wo findet man nun solche essentiellen Erkenntnisse wie, das FileOpen nur Readonly liest?
schönen Abend noch
lf
Chris
irgendwie wird außeracht gelassen das er meine Funktionen einfach benutzen kann.
Es funktioniert.
Grad mal aus POST #18 deinen Code kopiert meine funktionen reingesetzt und das script leicht verändert.
sieh :
; Script Start - Add your code below here
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <FileConstants.au3>
#include <MsgBoxConstants.au3>
#include <WinAPIFiles.au3>
#include "Services.au3"
#include <GDIPlus.au3>
#include <GuiCtrlSetOnHover_UDF.au3>
#include <StaticConstants.au3>
#include <String.au3>
#include <WinApi.au3>
#include <MsgBoxConstants.au3>
#include <ButtonConstants.au3>
#include <StringConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <date.au3>
#include <EditConstants.au3>
Global $ROUNDES = 20, $LastHwnd = 0
Global $LastHwnd
Global $GUIBKCOLOR = 0x738599
Global $SubBack = 0xEAF0E2
Global $nMSG
;MAINLOGIC
global $Form1 = GUICreate("TEST GUI", 173, 126, 192, 124)
global $Button1 = GUICtrlCreateButton("Button1", 16, 24, 75, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
_form3()
EndSwitch
WEnd
;Form3 Config1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _Form3()
Local $file = "C:\Program Files\Mozilla Firefox\confs\firefox_ext.cfg" ; für dich reaktiviert die Variable kannst du auch Global setzten wenn es dein einziges $file ist aber dann außerhalb der funktion _Form3
local $Form3 = GUICreate("Subform", 450, 425, -1, -1, BitOR($GUI_SS_DEFAULT_GUI,$WS_SIZEBOX,$WS_THICKFRAME)) ;Creates the GUI window
local $iEdit = GUICtrlCreateEdit('' & @CRLF & "Another Line", 0, 0, 500, 400, $ES_WANTRETURN + $WS_VSCROLL + $ES_AUTOVSCROLL + $ES_MULTILINE + $WS_TABSTOP)
local $hButton = GUICtrlCreateButton("Speichern", 160, 400, 107, 25, $WS_GROUP)
fileToedit($file, $iEdit); 1. öffnet datei 2. liest die datei, 3. füllt das Edit fenster 4. schließt die datei.
GUICtrlSetBkColor(-1, $SubBack)
GUICtrlSetResizing(-1, $GUI_DOCKAUTO)
GUICtrlSetLimit(-1, 0xFFFFFF)
ControlClick($Form3, "", $iEdit)
GUISetState(@SW_SHOW) ;Shows the GUI window
While 2
local $mMsg = GUIGetMsg()
Switch $mMsg
Case $GUI_EVENT_CLOSE
GUIDelete($Form3)
GUISetState(@SW_ENABLE, $Form3)
Return
Case $hButton
savefile($file, $iEdit);1. list das Edit feld aus, 2.öffnet das file im Overridemode(2) 3. überschreibt den Dateiinhalt mit dem ausgelesenen edit feld, bestätigt das mit einer msgbox. und schließt die Datei wieder.
EndSwitch
WEnd
EndFunc
Func savefile($file_, $edit_)
Local $read, $ofile
If FileExists($file_) = 1 Then
$read = GUICtrlRead($edit_, 1)
$ofile = FileOpen($file_, 2); öffne das File aber in den Overidemode
If FileWrite($ofile, $read) = 1 Then
MsgBox(0,"Fertig!",$file_ & " |.. wurde gespeichert!");msgbox mit in die funkiton gesetzt auser du magst die auserhalb dann klammer die zeile aus.
FileClose($ofile)
ElseIf 0 Then
ConsoleWrite('Fehler beim beschreiben der Datei.' & @CRLF)
EndIf
Else
ConsoleWrite('Datei exsistiert nicht.' & @CRLF)
EndIf
EndFunc
Func fileToedit($file_, $edit_)
Local $fopen, $read
If FileExists($file_) = 1 Then
$fopen = FileOpen($file_)
$read = FileRead($file_)
GUICtrlSetData($edit_, $read)
FileClose($fopen)
Return 1
ElseIf 0 Then
ConsoleWrite($file_ & '<-> ' & 'konnte nicht gefunden werden!' & @CRLF)
Return -1
EndIf
EndFunc ;==>fileToedit
Alles anzeigen
Edit habs nochmal auf dich angepasst.
die unnötigen stellen weggemacht und die Änderung kommentiert.
Du solltest mit copie pase direkt loslegen können.
... und wo findet man nun solche essentiellen Erkenntnisse wie, dass FileOpen nur Readonly liest?
FileOpen ließt nicht nur Read-Only. Das ist lediglich der Standardmodus, falls kein anderer [optionaler Parameter] Mode nach dem Dateinamen angegeben wird.
siehe Hilfe : FileOpen
Öffnet eine Datei zum Lesen oder Schreiben.
FileOpen ( "filename" [, mode = 0] )
filename | Dateiname der zu öffnenden Datei. |
mode | [optional] Modus in dem die Datei geöffnet werden soll. Kann auch eine Kombination aus folgenden sein: $FO_READ (0) = Lesemodus (Standard) $FO_APPEND (1) = Schreibmodus (anhängend an das Dateiende) $FO_OVERWRITE (2) = Schreibmodus (löschen des vorherigen Inhaltes) $FO_CREATEPATH (8) = Anlegen der Verzeichnisstruktur, wenn sie nicht existiert (siehe Bemerkungen). $FO_BINARY (16) = Erzwingt den Binärmodus (Siehe Bemerkungen) $FO_UNICODE or $FO_UTF16_LE (32) = Verwendet Unicode-UTF16 mit Little-Endian-Kodierung im Lese- und Schreibmodus $FO_UTF16_BE (64) = Verwendet Unicode-UTF16 mit Big-Endian-Kodierung im Lese- und Schreibmodus. $FO_UTF8 (128) = Verwendet Unicode-UTF8 Kodierung im Lese- und Schreibmodus. $FO_UTF8_NOBOM (256) = Verwendet Unicode-UTF8 (ohne BOM) im Lese- und Schreibmodus. $FO_ANSI (512) = Verwendet ANSI im Lese- und Schreibmodus. $FO_UTF16_LE_NOBOM (1024) = Verwendet Unicode UTF16 Little Endian (ohne BOM) im Lese- und Schreibmodus. $FO_UTF16_BE_NOBOM (2048) = Verwendet Unicode UTF16 Big Endian (ohne BOM) im Lese- und Schreibmodus. $FO_UTF8_FULL (16384) = Wenn zum Lesen geöffnet wird und kein BOM verfügbar ist, so wird auf die komplette Datei UTF8 oder UTF16 Erkennung angewendet. Falls dies nicht verwendet wird, so wird aus Performancegründen nur der Anfang der Datei (bis zu 64KB) untersucht. Der Verzeichnispfad muss bereits vorhanden sein (außer mode $FO_CREATEPATH wird verwendet - siehe Bemerkungen). |