Seite 1 von 1

umbenennen von Verzeichnissen / RunShell & *.BAT ?

Verfasst: Sa, 16. Dez 2006 5:58
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.

Verfasst: Sa, 16. Dez 2006 11:56
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

Verfasst: Sa, 16. Dez 2006 12:00
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.

Verfasst: Sa, 16. Dez 2006 12:05
von Martin Altmann
Hallo Hubert,
meine Rede :D
Rename kennt keine Platzhalter!
Wenn Platzhalter, dann move!

Viele Grüße,
Martin

Verfasst: Sa, 16. Dez 2006 12:14
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

Verfasst: Sa, 16. Dez 2006 12:35
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 !

Verfasst: Sa, 16. Dez 2006 13:09
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

Verfasst: Sa, 16. Dez 2006 13:21
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

Verfasst: Sa, 16. Dez 2006 13:45
von Koverhage
Hubert,

klar das wäre besser, aber zum Aufräumen bleibt manchmal wenig Zeit :(

Verfasst: Sa, 16. Dez 2006 17:11
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

Verfasst: Sa, 16. Dez 2006 17:15
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.

Verfasst: So, 17. Dez 2006 10:52
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

Verfasst: So, 17. Dez 2006 23:01
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
...

umbenennen / verschieben von Verzeichnissen mit Inhalt

Verfasst: Mi, 12. Nov 2008 11:40
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 ?

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

Verfasst: Mi, 12. Nov 2008 12:50
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.

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

Verfasst: Mi, 12. Nov 2008 13:45
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

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

Verfasst: Mi, 12. Nov 2008 17:12
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

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

Verfasst: Mi, 17. Dez 2008 15:48
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

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

Verfasst: Mi, 17. Dez 2008 17:14
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)

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

Verfasst: Mi, 17. Dez 2008 17:19
von Friedhelm
Die Ausdrücke mit dem Macro-Operator &

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

Verfasst: Mi, 17. Dez 2008 17:38
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