umbenennen von Verzeichnissen / RunShell & *.BAT ?

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von AUGE_OHR »

hi,

ich möchte Verzeichniss umbennen (mit Xbase++) unter W2K/XP.
(unter W98 funktionierte es ...)

Verzeichnis von D:\ALASKA\FTP2BBS

18.11.06 00:20 <DIR> .
18.11.06 00:20 <DIR> ..
16.12.06 05:11 <DIR> 1122
16.12.06 05:11 <DIR> 1123
16.12.06 05:11 <DIR> 1124
16.12.06 05:11 <DIR> 1125

aus 1122 soll 20061122 werden. Nun hab ich es zuerst "direkt" versucht

Code: Alles auswählen

PRIVATE cDummy,cFile
...
   FOR i = 1 TO nDirZahl
         cFile   := aFiles[i,F_NAME]
         cDummy := STR(YEAR(DATE()),4)+cFile
?        RunShell( "/C RENAME &cFile.* &cDummy.*")
   NEXT
das ging leider nicht ... also dann einen BATch :

Code: Alles auswählen

   FOR i = 1 TO nDirZahl
         cFile       := aFiles[i,F_NAME]
         cDummy := STR(YEAR(DATE()),4)+cREN

         cREN := "RENAME "+cFile".* "+cDummy+".*"
         cBAT := cBAT+cREN+cCRLF
   NEXT

   cBAT := cBAT+"WAIT"
   MemoWrit( "REN_ME.BAT", cBAT )
   INKEY(3)

   RunShell( "","REN_ME.BAT",.T.)
   RunShell( "/C REN_ME.BAT")
aber auch das bringt nicht ...
In der "REN_ME.BAT" steht nun :

Code: Alles auswählen

RENAME 1122.* 20061122.*
RENAME 1123.* 20061123.*
RENAME 1124.* 20061124.*
RENAME 1125.* 20061125.*
WAIT
wenn ich die im CMD Fenster starte sagt er "Syntax Error". Wenn ich es
aber dann im Norton Commander starte (lädt eine Command.com) dann
geht es und die Verzeichnisse werden umbenannt ?!

wo liegt bei mir der "Denkfehler" ? wieso geht es 3x nicht und mit 1x ja ?

gruss by OHR
Jimmy
p.s. mit SHFILE (von Thomas Braun) geht es auch nicht und eine andere
"rename" API hab ich nicht gefunden.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Jimmy,
soweit ich weiß, akzeptiert RENAME keine Platzhalter!
Norton hat einen eigenen Kommandointerpreter.
Nimm doch das Kommando move.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

warum so umständlich ?

ich habe gerade auf meiner Festplatte folgende Verzeichnisse angelegt:
hb_test1
hb_test2
hb_test3
hb_test4

und folgendes Xbase++ Programm laufen lassen

Code: Alles auswählen

proc main
   rename hb_test1 to hb_test.1
   rename hb_test2 to hb_test.2
   rename hb_test3 to hb_test.3
   rename hb_test4 to hb_test.4
return
nun habe ich
hb_test.1
hb_test.2
hb_test.3
hb_test.4

Also wie bei allen XBase Dateibefehlen (delete file ...) mit Directory() die Platzhalten auflösen, Pfade ergänzen und dann rename (cDatei) to (cNeuDatei) aufrufen.
Gruß
Hubert
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16502
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
meine Rede :D
Rename kennt keine Platzhalter!
Wenn Platzhalter, dann move!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Jimmy,

geht das bei dir nicht? :o

frename( "DirNameAlt", "DirNameNeu" )

Ist vielleicht in dem Verzeichnis, das du umbenennen willst, eine Datei im RW-Modus geöffnet?

Viele Grüße,
Günter
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Martin Altmann hat geschrieben:Hallo Hubert,
meine Rede :D
Rename kennt keine Platzhalter!
du sprachst von CMD Befehlen und Nortons Befehlserweiterungen, ich von Xbase++.
Da gibt es den RENAME TO direkt so wie FILE COPY TO ...
:wink:

Und natürlich hat Günter recht, um ein Verzeichnis umbenennen oder verschieben (das ist bei Xbase++ das gleiche) zu können, darf nichts daraus geöffnet sein. Es reicht schon eine cmd Box die in dem Pfad angezeigt wird und umbennen ist unmöglich !
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Jimmy,

vielleicht hilft Dir das ?

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function makedir()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
function makedir( cDirect )

CreateDirectoryA( @cDirect, 0 )
return .t.

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function deldir()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
function deldir( cDirect )

RemoveDirectoryA( @cDirect )
return .t.

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function rendir()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
function rendir( cSourceDir, cDestDir )

MoveFileA( @cSourceDir, @cDestDir )
return .t.

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+ Function dirchange()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
function dirchange( cDirect )

SetCurrentDirectoryA( @cDirect )
return .t.



DLLFUNCTION SetCurrentDirectoryA( @cDirect ) USING STDCALL from KERNEL32.DLL
DLLFUNCTION RemoveDirectoryA( @cDirect ) USING STDCALL from KERNEL32.DLL
DLLFUNCTION MoveFileA( @cSourceDir, @cDestDir ) USING STDCALL from KERNEL32.DLL
DLLFUNCTION CreateDirectoryA( @cDirect, cSecur ) USING STDCALL from KERNEL32.DLL
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Klaus,

deine Funktionen geben immer .t. zurück, besser wäre es, wenn du den Rückgabewert von den Funktionen nutzen würdest:

0 = CreateDirectoryA() -> Fehler
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Hubert,

klar das wäre besser, aber zum Aufräumen bleibt manchmal wenig Zeit :(
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Beitrag von AUGE_OHR »

hi,

danke für eure Kommentare und Vorschläge. Ich werde die alle evaluieren
und mein Modul noch mal umstellen.

... noch eine dumme Frage : was ist der "unterschied" ein CMD zu einem *.BAT ? Wenn ich in einer *.BAT (unter W2K/XP) eine weiter *.BAT per
"call Mehr.BAT" aufrufen will meckert er ... ?

gruss by OHR
JImmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi Jimmy,

*.BAT Dateien sind für 16 Bit Systeme (DOS / Win98).
*.CMD Dateien sind für 32 Bit Systeme (OS/2, NT ff).
Diese führen die alten BAT zwar aus, aber eigentlich sollte man CMD benutzen.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Jimmy,

wenn Du die API Aufrufe nutzt brauchst Du den Umweg über Bat/Cmd Files nicht und dadurch das die in allen Folgeversion von Windows laufen sollten,
auch unabhängig was Xbase++ Versionen betrifft.

Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo

und wer die Befehle von Xbase++ selbst benutzt, ist auf der ganz sicheren Seite, solange er keine Rückgabewerte braucht ;-)

In 1.90:

CreateDir() // sogar mit Fehlermeldungsunterstützung
RemoveDir() // sogar mit Fehlermeldungsunterstützung
copy file // schon zu clippers Zeiten
delete file // "
curdir(cNeu) // kann auch ändern
curdrive(cNeu) // kann auch ändern
...
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

umbenennen / verschieben von Verzeichnissen mit Inhalt

Beitrag von AUGE_OHR »

hi,

ich habe eine "fast" volle Festplatte mit MP3. Diese sind in "tausenden" von Ordnern.
In meiner DBF hab ich nun den Path sodas ich auf jede MP3 zugreifen kann. Im Browse
kann ich die Spalten sortieren sodas ich mit dem eigentlich alles im Griff habe.

nun kommt es selten einmal vor das ich ein MP3 File suche ohne den Browser und da fällt es
mir doch schon auf wie "unsortiert" die im Explorer erscheinen ... ohne Browser kaum zu finden.

Also dachte ich mir mal "aufzuräumen", natürlich mit Xbase++

Code: Alles auswählen

Function RenDir( cSourceDir, cDestDir )
LOCAL nret := MoveFileA( @cSourceDir, @cDestDir )
RETURN ( IF(nRet>0,.T.,.F.) )

DLLFUNCTION MoveFileA( @cSourceDir, @cDestDir ) USING STDCALL from KERNEL32.DLL 
Problem : Ich möchte ganze Verzeichnisse mit Inhalt verschieben, aber
Parameter:
lpExistingFileName Erwartetet den vollständigen Dateinamen (inkl. Pfadangabe) der Datei, die umbenannt oder verschoben werden soll.

lpNewFileName Der neue Name der Datei oder des Verzeichnisses, wobei ein solcher Name noch nicht existieren darf. Handelt es sich lpExistingFileName um einen Ordner, so kann dieser nicht auf ein anderes Dateisystem oder Laufwerk verschoben werden!
das kann ich anscheint nicht mit der Function ?

Ein Createdir() (ab v1.9x) könnte ich ja machen aber beim RemoveDir() bekomme ich Problem mit
dem "timeing" den meisten meint das OS() es könnte den Ordner nicht löschen weil noch "was
drin" ist ... paar Sekunden später geht es ...

kennt jemand einen "Trick" wie ich das umgehen kann ?
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von brandelh »

Hallo Jimmy,

wenn du ein ganzes Verzeichnis umgenennen (verschieben auf gleicher Festplatte) möchtest,
warum nicht einfach so:

Code: Alles auswählen

RENAME (cAltDir) TO (cNeuDir)
der neue Name muss natürlich frei sein und keine der Dateien darf in Verwendung sein !
Auch kein Explorer oder CMD etc.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben: wenn du ein ganzes Verzeichnis umgenennen (verschieben auf gleicher Festplatte) möchtest,
warum nicht einfach so:

Code: Alles auswählen

RENAME (cAltDir) TO (cNeuDir)
der neue Name muss natürlich frei sein und keine der Dateien darf in Verwendung sein !
Auch kein Explorer oder CMD etc.
hm geht das wirklich mit Verzeichnissen ? ... ich dachte es wäre nur für den Dateinamen.
... ich werde es mal versuchen.

unglaublich es funktioniert !!! DANKE

Code: Alles auswählen

PROCEDURE MAIN
LOCAL cOldFile := "D:\ALASKA\V340\0\"
LOCAL cNewFile := "D:\ALASKA\4\"

RENAME (cOldFile) TO (cNewFile)
RETURN
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von brandelh »

AUGE_OHR hat geschrieben: unglaublich es funktioniert !!! DANKE
ja meinste ich weiß nicht was ich schreibe ? ;-)

Im Ernst, ich war damals auch überrascht als ich es herausgefunden hatte.
Der DOS Befehl RENAME verweigerte ja auch Verzeichnisse ... unter XP gehts aber nun auch :D
Gruß
Hubert
Benutzeravatar
Friedhelm
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Sa, 08. Apr 2006 17:20
Wohnort: Leverkusen
Kontaktdaten:

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von Friedhelm »

Hallo,

Wie ich das sehe werden im RunShell()-aufruf die Dateinamen als Macro aufgelöst.
Die Terminierung eines Macros geschieht mit einem Puntk. In diesem Fall soll der Punkt aber
als Trennung der Dateinamenserweiterung verwendet werden. Bei der Auflösung der Dateinamen Macros
werden die Punkte für das Trennsymbol als Literal aufgelöst sondern als Terminator für das Macro verwendet.

versuche es doch einfach mal mit zwei punkten:

Code: Alles auswählen

PRIVATE cDummy,cFile
...
   FOR i = 1 TO nDirZahl
         cFile   := aFiles[i,F_NAME]
         cDummy := STR(YEAR(DATE()),4)+cFile
?        RunShell( "/C RENAME &cFile..* &cDummy..*")
   NEXT
Im übrigen gibt es in der Windows API eine Funktion "MoveFileEx" (Kernel32.dll):

The MoveFileEx function renames an existing file or directory.

Code: Alles auswählen

BOOL MoveFileEx(

    LPCTSTR lpExistingFileName,	// address of name of the existing file  
    LPCTSTR lpNewFileName,	// address of new name for the file 
    DWORD dwFlags 	// flag to determine how to move file 
   );	

Grüße
Friedhelm
Gruß Friedhelm
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von brandelh »

Friedhelm hat geschrieben: Wie ich das sehe werden im RunShell()-aufruf die Dateinamen als Macro aufgelöst.
welches MACRO meinst du ? Xbase sicher nicht und auf der Commandozeile habe ich nie ein & benutzt ...
Friedhelm hat geschrieben: versuche es doch einfach mal mit zwei punkten:

Code: Alles auswählen

         cFile   := aFiles[i,F_NAME]
         cDummy := STR(YEAR(DATE()),4)+cFile
?        RunShell( "/C RENAME &cFile..* &cDummy..*")

cFile und cDummy sind Xbase Variablen und die muss man in Xbase selbst auflösen ...

Code: Alles auswählen

         cFile   := aFiles[i,F_NAME]
         cDummy := STR(YEAR(DATE()),4)+cFile
?        RunShell( "/C RENAME "+chr(34)+cFile+chr(34)+" "+chr(34)+cDummy+chr(34) )
Friedhelm hat geschrieben: Im übrigen gibt es in der Windows API eine Funktion "MoveFileEx" (Kernel32.dll):
The MoveFileEx function renames an existing file or directory.
es gibt auch in Xbase++ direkt einen RENAME TO Befehl, dieser ist mindestens genausogut wie der RUNSHELL, gibt aber keine Fehlermeldungen zurück. Mit file() kann man es ja überprüfen. Eventuell auch mit ferror() ?

Code: Alles auswählen

RENAME (cFile) TO (cDummy)
Gruß
Hubert
Benutzeravatar
Friedhelm
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 46
Registriert: Sa, 08. Apr 2006 17:20
Wohnort: Leverkusen
Kontaktdaten:

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von Friedhelm »

Die Ausdrücke mit dem Macro-Operator &
Gruß Friedhelm
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: umbenennen von Verzeichnissen / RunShell & *.BAT ?

Beitrag von Tom »

Friedhelm will auf einen Fehler in Jimmys Beispiel hinweisen.

Code: Alles auswählen

cFile := "test.dbf"
? "Bla&cFileBla" // Ergebnis: Bla&cFileBla
? "Bla&cFile.Bla" // Ergebnis: Blatest.dbfBla
Herzlich,
Tom
Antworten