Dateioperation: Datei umbenennen

  • Themenstarter Themenstarter Dragosani
  • Beginndatum Beginndatum
D

Dragosani

Hallo,

ich weiß, daß es unhöflich ist, wenn man mit seinem ersten Post gleich eine Frage stellt, aber ich weiß im Moment nicht mehr, was da falsch sein könnte.

Es geht um folgendes Programm:
Code:
#include <cstdlib>
#include <dirent.h>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    DIR *hdir;
    struct dirent *entry;

    hdir = opendir("./test");
    do
    {
        entry = readdir(hdir);
        if (entry)
        {
            cout << entry->d_name << endl;
            char a[entry->d_namlen],b[entry->d_namlen-4];
            for (int i=0;i<entry->d_namlen;i++)
            {
                a[i]=entry->d_name[i];
            }
            for (int i=0;i<entry->d_namlen;i++)
            {
                b[i]=entry->d_name[i+4];
            }
            for(int i=0;i<entry->d_namlen-4;i++)
            {
                    cout << b[i];
            }
                    cout << endl;
            rename(a,b); 
            
        }
    } while (entry);
    closedir(hdir);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Der Sinn dahinter soll sein, daß dieses kleine Programm alle Dateien in dem Unterordner "test" umbenennen soll und dabei die ersten 4 Stellen wegläßt. Das Programm wird fehlerfrei kompiliert und ausgeführt, aber dennoch wird nichts umbenannt. Im Array b[] ist auch korrekt der gekürtzte Name drin.

Was habe ich denn nun schon wieder falsch gemacht :confused:

Helft einem Anfänger - ach ja, ich nutze DevC, Windows XP.
 
Hi.

Versuch's mal so:
C++:
hdir = opendir("./test");
chdir("./test"); // ist notwendig, sonst werden die Dateien ja nicht gefunden.
...
if (entry) {
  if (strlen(entry->d_name) > 4) {
    if (rename(entry->d_name, entry->d_name+4) != 0) {
      perror("rename failed");
    }
  }
}

Das d_namlen Feld ist übrigens non-Standard und deshalb ist von der Verwendung abzuraten.

Gruß
 
Juhu :) Danke tausend Mal. Nun geht es (vor allem das chdir("./test"); fehlte mir). Juhu
 
So, ich kam endlich dazu noch ein wenig weiter zu testen. Ich bin mir nicht sicher, ob es hier rein paßt, aber ich versuche es einfach mal.

Folgendes Beispiel kann ich wunderbar als Konsolenprogramm im Dev-CPP kompilieren:
C++:
#include <cstdlib>
#include <dirent.h>
#include <iostream>
#include <string>  //für std::string

using namespace std;

int main(int argc, char *argv[])
{
    DIR *hdir;
    struct dirent *entry;
       hdir = opendir("./rename");
    chdir("./rename");

    cout << "Erfolgreich ins Verzeichnis gewechselt..." << endl;

    do
    {
        entry = readdir(hdir);
        if (entry)
        {
            cout << entry->d_name << endl;
            string a,b;
            a = entry->d_name;
            b = entry->d_name+4;
            cout << b << endl;
            rename(a.c_str(),b.c_str());
        }
    } while (entry);
    closedir(hdir);
    system("PAUSE");
    return EXIT_SUCCESS;
}

Nun dachte ich mir, ich versuche mich mal an einer kleinen GUI. Also versuchte ich es via M$ Visual C++ (2005) umzusetzten. Aber er kompiliert die Anweisungen im onClick nicht.

hier mal die entsprechenden Codezeilen:
C++:
#include "stdafx.h"
#include "Rename2.h"
#include "Rename2Dlg.h"
#include <dirent>
#include <cstdlib> 
#include <iostream> 
#include <string>  //für std::string 

[gekürzt]


void CRename2Dlg::OnBnClickedRename()
{	
    DIR *hdir; 
    struct dirent *entry; 
    
    hdir = opendir("k:/test"); 
    chdir("k:/test");
    do 
    { 
        entry = readdir(hdir); 
        if (entry) 
        { 
            string a,b; 
            a = entry->d_name; 
            b = entry->d_name+4; 
            rename(a.c_str(),b.c_str()); 
        } 
    } while (entry); 
    closedir(hdir); 
}

Die Fehlermeldungen sind diese (sie sagen mir leider garnichts :():
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(198) : error C2065: 'DIR' : undeclared identifier
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(198) : error C2065: 'hdir' : undeclared identifier
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(201) : error C3861: 'opendir': identifier not found
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(202) : error C3861: 'chdir': identifier not found
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(205) : error C3861: 'readdir': identifier not found
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2065: 'string' : undeclared identifier
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2146: syntax error : missing ';' before identifier 'a'
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2065: 'a' : undeclared identifier
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(208) : error C2065: 'b' : undeclared identifier
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(209) : error C2027: use of undefined type 'CRename2Dlg::OnBnClickedRename::dirent'
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(199) : see declaration of 'CRename2Dlg::OnBnClickedRename::dirent'
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(209) : error C2227: left of '->d_name' must point to class/struct/union/generic type
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(210) : error C2027: use of undefined type 'CRename2Dlg::OnBnClickedRename::dirent'
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(199) : see declaration of 'CRename2Dlg::OnBnClickedRename::dirent'
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(210) : error C2227: left of '->d_name' must point to class/struct/union/generic type
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(211) : error C2228: left of '.c_str' must have class/struct/union
type is ''unknown-type''
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(211) : error C2228: left of '.c_str' must have class/struct/union
type is ''unknown-type''
c:\dokumente und einstellungen\dragosani\eigene dateien\visual studio 2005\projects\rename2\rename2\rename2dlg.cpp(214) : error C3861: 'closedir': identifier not found
Build log was saved at "file://c:\Dokumente und Einstellungen\dragosani\Eigene Dateien\Visual Studio 2005\Projects\Rename2\Rename2\Debug\BuildLog.htm"
Rename2 - 16 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Könnt ihr damit etwas anfangen?
 
Hi.
Die Fehlermeldungen sind diese (sie sagen mir leider garnichts :():


Könnt ihr damit etwas anfangen?
Ja. Der Header dirent.h ist ein Linux/Unix-spezifischer Header und dieser ist standardmäßig für Windows nicht verfügbar. Mit Dev-Cpp kannst du den Code dennoch übersetzen da die MinGW Laufzeitumgebung die darin enthaltenen Funktionen trotzdem bereitstellt.

Man kann auch unter Windows mit den Visual Development Tools Unix-Programme kompilieren wenn man Interix installiert (was im Windows Services for UNIX Paket enthalten ist). Allerdings ist auch hierbei etwas Vorsicht geboten, teils müssen die Programme dennoch erst angepaßt werden.

Unter Windows kannst du ein Verzeichnis mit den FindFirstFile und FindNextFile Funktionen durchsuchen und löschen kannst du eine Datei mit der DeleteFile Funktion. Beispiele hierzu findest du bei Google oder hier im Forum.

Siehe auch MSDN Unix Code Migration Guide.

Gruß
 

Neue Beiträge

Zurück