[C++] Schreibschutz einer Datei entfernen

Gruß Thomas!

Grand Admiral Special
Mitglied seit
27.03.2008
Beiträge
2.027
Renomée
118
Standort
Bayreuth
  • Docking@Home
Ich will derzeit ein Programm schreiben, das die configs bei CS 1.5 austauscht bevor es gestartet wird. Bloß auf diesen ist ein Schreibschutz, d.h. wenn ich die config.cfg zum austauschen löschen will und danach eine andere dafür einsetzen will, funktioniert das nicht weil ja der Schreibschutz bestand hat.

Und jetzt komm ich zu meiner Frage:

Wie kann ich den Schreibschutz einer Datei in C++ entfernen?

Danke schon mal im Vorraus

mfg

elite.bl4ze
 
versuch mal


_chmod( filename, _S_IWRITE )


bzw. um ihn wieder zu setzen:
_chmod( filename, _S_IREAD)
 
Naja, das sind ja cmd Commands oder?

Ich würde es gerne mit so wenig Windows Commands machen wie möglich ;)

Brauch ich dafür irgendwelche includes dafür? Eig nicht oder?
 
den Befehl kannst Du direkt aufrufen, oder was meinst Du mit cmd Command?

Includen musst Du die "io.h"

ansonsten guck doch einfach ins MSDN ;) (_chmod, _wchmod)

ob es "neuere" Befehle gibt, weiß ich nicht.
 
Ähm, meinst du zufällig "iostream.h" ?

Und irgendwie funktioniert das nicht so recht, wie dus gesagt hast:

PHP:
_chmod("cstrike/config.cfg", _S_IWRITE );

PHP:
  C:\Dev-Cpp\configchanger\main.cpp `_S_IWRITE' undeclared (first use this function) 
  (Each undeclared identifier is reported only once for each function it appears in.)
 
Zuletzt bearbeitet:
guck in die MSDN


Example

/* CHMOD.C: This program uses _chmod to
* change the mode of a file to read-only.
* It then attempts to modify the file.
*/

PHP:
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>

void main( void )
{
   /* Make file read-only: */
   if( _chmod( "CHMOD.C", _S_IREAD ) == -1 )
      perror( "File not found\n" );
   else
      printf( "Mode changed to read-only\n" );
   system( "echo /* End of file */ >> CHMOD.C" );

   /* Change back to read/write: */
   if( _chmod( "CHMOD.C", _S_IWRITE ) == -1 )
      perror( "File not found\n" );
   else
      printf( "Mode changed to read/write\n" );
   system( "echo /* End of file */ >> CHMOD.C" ); 
}


Output

Mode changed to read-only
Access is denied
Mode changed to read/write

mit "cstrike/config.cfg", als Pfad wirst Du in C(++) Probleme bekommen ;)

versuch mal "cstrike//config.cfg",
 
Das interessiert ihn aber trotzdem nicht, wenn ichs genauso wie in dem Beispiel mach...
 
Wer meckert denn, der Compiler oder wirft die Funktion ein -1 zurück?
 
Der Compiler mosert, das macht er gerne ;)

Siehe Fehlermeldung, die ich oben gepostet hab.

PHP:
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <windows.h>
#include <io.h>


using namespace std;


int main()
{
   int auswahl;
   cout<<"Welche Config soll geladen werden? \n 1: Deaglerz | s4ke \n 2: s4ke\n";
   cin>>auswahl;
   cout<<"\n\n";
   switch (auswahl)
   { 
          
                                   case 1:
                                          _chmod( "cstrike//config.cfg", _S_IWRITE );
                                          remove("cstrike//config.cfg");
                                          CopyFile("cstrike//configs//configdgl.cfg", "cstrike//config.cfg", false);
                                          
               
               
                                   case 2:
                                          _chmod( "cstrike//config.cfg", _S_IWRITE );
                                          remove("cstrike//config.cfg");
                                          CopyFile("cstrike//configs//configs4ke.cfg", "cstrike//config.cfg", false);
   }
   WinExec("cstrike.exe -console",SW_SHOW);
}

EDIT:

Schande über mich... Hab vergessen was zu includen xD...
 
Zuletzt bearbeitet:
hmmm, welchen Compiler benutzt Du?

Also das "_S_IWRITE" ist bei mir in der #include <sys/stat.h> definiert.

Frag mich jetzt nicht über welche Umwege das bei mir eingebunden wird.
Im MSDN Beispiel wird es ja auch eingebunden...
 
Das Problem ist schonmal weg...

Aber irgendwie geht des austauschen immer noch nicht...
 
Das Problem ist schonmal weg...

Aber irgendwie geht des austauschen immer noch nicht...

woran liegt es?

am löschen oder kopieren?
(sind doch 2 getrennte Befehle)

wer setzt den Schreibschutz? Da läuft doch nicht schon 1 Programm und blockiert alles?
 
Hmmm... Ich glaub ich mach jetzt das ganze mal mit Ausgabe obs funktioniert oder nicht, sonst sitz ich hier noch Stunden xD

Hmm, irgendwie führt er wenn ich das erste auswähle das zweite gleich mit aus, daher kommt warscheinlich der Fehler...

Ich idiot...

Ich hab break; vergessen oder?
 
Zuletzt bearbeitet:
Ja, das nehm ich mir immer wieder vor... Aber irgendwie xD kp.

Jetzt funktioniert alles wie ichs will.
 
hach, das gute alte break... :)
Bei c# ists mandatory nach jedem case-Block sofern kein goto case kommt ;)
 
hach, das gute alte break... :)
Bei c# ists mandatory nach jedem case-Block sofern kein goto case kommt ;)

ne, wenn der case block keinen code enthält, verhält sich auch c# wie c++ hier...

Code:
switch(auswahl) {
  case 1:
  case 2:
    DoSomething();
    break;
  case 3:
    DoSomethingElse();
    break;
}
 
ne, wenn der case block keinen code enthält, verhält sich auch c# wie c++ hier...

Code:
switch(auswahl) {
  case 1:
  case 2:
    DoSomething();
    break;
  case 3:
    DoSomethingElse();
    break;
}



bist Du sicher?
Ich hätte jetzt auch geschworen, dass dies in C# nicht mehr geht.
Liegt vielleicht auch am Compiler? (VS2005)

Morgen teste ich das noch mal :)
 
Das kommt davon, wenn man mal ne längere Pause macht, bzw. nen Teil der Programmiersprache nicht mehr benutzt... xD
 
bist Du sicher?
Ich hätte jetzt auch geschworen, dass dies in C# nicht mehr geht.
Liegt vielleicht auch am Compiler? (VS2005)

Morgen teste ich das noch mal :)
Ich habe im MSDN nachgeschaut:
With one exception, (unlike the C++ switch statement), C# does not support an implicit fall through from one case label to another. The one exception is if a case statement has no code.
Wusste ich auch noch nicht.
 
Das kommt davon, wenn man mal ne längere Pause macht, bzw. nen Teil der Programmiersprache nicht mehr benutzt... xD
Wie Recht du hast, manchmal vergisst man auch für was es Shell-Skripte gibt und wann man diese einsetzt. ;)
Code:
@echo off
:start
cls
@echo Welche Config soll geladen werden?
@echo 1: Deaglerz / s4ke
@echo 2: s4ke
@echo A: Abbruch!
SET /P EINGABE=Bitte um Auswahl: 
IF "%EINGABE%" == "1" goto :c1
IF "%EINGABE%" == "2" goto :c2
IF "%EINGABE%" == "A" goto :eof
@echo falsche Eingabe!
SET /P =^G<nul
pause
goto :start
:c1
@echo rename,copy,del 1
goto :cstrike
:c2
@echo rename,copy,del 2
:cstrike
@echo cstrike.exe -console
@echo on
Anmerkung: ^G ist das ASCII Zeichen 0x07 und gibt einen BEEP aus.
 
*chatt**chatt*
Ich habe im MSDN nachgeschaut:

Wusste ich auch noch nicht.


das kann wirklich sein, ich habe dies nämlich mal irgendwann versucht (allerdings mit Code im jeweiligen Case Fall) und ich meine in C# ging das nicht mehr. Da musste man sich immer mit GoTo aushelfen

Morgen werd ich noch mal gucken und es würde mich nicht wundern, wenn ich dies auch bereits mehrfach programmiert hätte *chatt*
 
Und ich habe bisher in C# offenbar nie ein Fallthrough benötigt.
 
Stimmt, die Ausnahme gibt es, aber wirklich nur für den "case ist leer" - Fall.
Sobald auch nur eine einzige Anweisung folgt, wird vom Compiler ein "break" oder "goto case" verlangt.
 
Stimmt, die Ausnahme gibt es, aber wirklich nur für den "case ist leer" - Fall.
Sobald auch nur eine einzige Anweisung folgt, wird vom Compiler ein "break" oder "goto case" verlangt.
Nein, eben nicht! So ist es bei C++, aber nicht bei C#. Wenn das case leer ist, wird ein Fallthrough durchgeführt. Ist das case nicht leer, wird am Ende des case automatisch ein break ausgeführt. Ein manuelles break ist nicht mehr nötig.
C++ führt dagegen immer einen Fallthrough durch, wenn kein break gesetzt wird.
 
Zurück
Oben Unten