Gå til innhold

Endre filnavn med c++?


Anbefalte innlegg

Skrevet

Hei jeg ønsker å lage et lite program for windows som skal:

 

-hente mappe-posisjon fra der den kjøres

-finne alle filer i alle mapper i og innenfor sin egen posisjon

-endre filnavnet

 

Filnavnet ønsker jeg å endre med egendefinerte regler skrevet rett inn i koden.

 

Kan noen gi meg tips for dette?

Videoannonse
Annonse
Skrevet

Windows har et eget API for dette.

 

Etter det jeg vet, så er det ikke med noe STL bibliotek for de funksjoene. Det finnes kanskje noen API med høyere abstraksjon enn Win32-API-et har.

 

Er det noen spesifikk grunn til at du vil gjøre dette i C/C++?

Skrevet

Nei det er ikke det. Men jeg kunne godt tenke meg å lære meg det i c++. Det er jo mange programmer til windows som håndterer filer og som er skrevet i c++.

 

Hvordan kan jeg ta ibruk dette i Visual Studio?

Skrevet

Nei det er ikke det. Men jeg kunne godt tenke meg å lære meg det i c++. Det er jo mange programmer til windows som håndterer filer og som er skrevet i c++.

 

Hvordan kan jeg ta ibruk dette i Visual Studio?

 

#include <Windows.h>

Skrevet

find [path] -name '[pattern]' -exec mv {} [new] \;

 

Finnes det ikke noe slikt for Windows? Uansett er det en oppgave hvor et scriptingspråk er godt egnet.

 

Om det er for å lære C++ er det nå så, men da kommer jeg på bedre ting enn å avhenge av Windpws-APIer. :)

Gjest Slettet-Pqy3rC
Skrevet

Om det er for å lære C++ er det nå så, men da kommer jeg på bedre ting enn å avhenge av Windpws-APIer. :)

Tja... han kan jo skrive det som en template og hvor del 2 blir å få det til å kjøre under Linux.

Skrevet

Programmeringsspråk er så mye mer konsekvente enn det shell-språk er... ikke at Win32-API er et bra eksempel på dette. Men det å skrive slike ting i C# er så mye enklere enn shell-språk. Man må skrive litt mer, men det er så utrolig mye mer konsekvent og pålitelig enn det bash er.

 

Eksempelvis det å liste fra en mappe og bruker regex for å velge filer krever null oppslag i dokumentasjonen for å få til.

  • Liker 1
Gjest Gjest slettet-ld9eg7s96q
Skrevet (endret)

QT metode:

 

#include <QtCore>
#include <QDebug>
void finnFil(const QString& sDir, QString kilde, QString maal) {
QDir dir(sDir);
QFileInfoList list = dir.entryInfoList();
for (int iList=0; iList < list.count(); iList++) {
	QFileInfo info = list[iList];
	QString kildeFilSti = info.filePath();
	if (info.isDir()) {
		if (info.fileName()!=".." && info.fileName()!=".") {
			finnFil(kildeFilSti, kilde, maal);
		}
	} else if (info.isFile() && info.fileName() == kilde) {
		QFile fil;
		QString nyttFilNavn = info.absoluteDir().absolutePath();
		nyttFilNavn.append("/");
		nyttFilNavn.append(maal);
		fil.rename(kildeFilSti, nyttFilNavn);
		qDebug() <<kildeFilSti
				 <<"\r\n\r\nHar endret navn til:\r\n\r\n"
				 <<nyttFilNavn;
		fil.close();
	}
}
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QDir dir;
QString arbeidsKatalog = dir.absolutePath();
qDebug() <<"Gjeldende arbeidskatalog:\r\n"
		 <<dir.absolutePath();   // Returnerer katalogen programmet kjøres ifra
finnFil(arbeidsKatalog, "tekstdokument.txt", "nyttnavn.txt"); // Endre filnavn

return a.exec();
}

 

Fungerer like fint om det er i Windows, Mac, Linux m.m. :)

 

PS: Du kan kompilere dette fra Visual Studio hvis du bygger QT bibliotekene for MSVC++, men QT's IDE er nå langt bedre i bruk enn microsoft sin IMHO.

 

PPS: Jeg kunne selvsagt gjort programmet mye mer brukbart ved å ta imot argumenter fra argv, men dette ble snekret sammen temmelig kjapt og dirty

Endret av Gjest slettet-ld9eg7s96q
Gjest Slettet-Pqy3rC
Skrevet

Det finnes en header for dette (filnavn, directory) i Boost også såvidt jeg husker.

 

Dog blir vel både QT og Boost noe utenfor hva som kan kalles standard C++ (om noe så er vel Boost nærmest).

Gjest Gjest slettet-ld9eg7s96q
Skrevet (endret)

QT bruker standard C++ men bygger på språket med sin meta object compiler og makroer. Hvis man vil være purist av prinsipp er det jo helt greit men også en smule masochistisk spør du meg. Man bruker de verktøyene man har til rådighet, således faller dette ikke utenfor domenet til C++ etter min mening.

Endret av Gjest slettet-ld9eg7s96q

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...