[C#] Ecrasement fichier..

Résolu
Signaler
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005
-
 cs_coq -
Salute,



J'aimerai savoir comment éviter l'écrasement d'un fichier que j'enregistre à partir de C#.



Le but de mon programme

Après un Print écran, je lance le programme qui celui-ci m'enregistre sur le bureau un Bitmap nommé Test.



J'explique ce que je veux faire par un exemple

Lorsque j'ai effectué un premier enregistrement, sur le bureau il y a
l'image Test.bmp, si je refais un Print Ecran et que je relance le
programme ça va enregistrer par dessus en écrasant le fichier.
Je voudrais pouvoir éviter ça en ajoutant Test (n).bmp (n étant un
chiffre) à chaque sauvegarde afin d'éviter l'ecrasement.



Comment faire ?



Mon code




/*

 * Created by SharpDevelop.

 * User: Machjaghjolu

 * Date: 02/07/2005

 * Time: 08:28

 * 

 * To change this template use Tools | Options | Coding | Edit Standard Headers.

 */

using System;

using System.Drawing;

using System.Windows.Forms;



namespace CaptureScreen

{

    public class MainForm : System.Windows.Forms.Form

    {

        public static void Main(string[] args)

            { 

        IDataObject iData = Clipboard.GetDataObject();

          

        Bitmap img = (Bitmap) iData.GetData(DataFormats.Bitmap);

        

            img.Save (@"C:\Documents and Settings\All Users\Bureau\Test.bmp");

            }

    }

}

35 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Tu fais une boucle jusqu'à que tu trouves un fichier qui n'existe pas encore, ça donne quelques chose dans ce genre (rapidement fait) :

string file = @"C:\Documents and Settings\All Users\Bureau\Test.bmp";
while(File.Exists(file))
{
fileName = Path.GetFileNameWithoutExtention(file);
int val = (int)s[s.Lenght - 1];
val++;
file = string.Format(@"C:\Documents and Settings\All Users\Bureau\Test{0}.bmp", val);
}

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Comme les ":" ne sont pas valide pour nom de fichier, tu devrais plutôt faire comme ceci :

string file =
string.Format(@"C:\Documents and Settings\Bidou\Desktop\Test{0}.bmp", DateTime.Now.ToString("ddMMyyhhmmss"));

Bon je vais dormir (je commence à dire n'importe quoi ), au cas où tu arriverais toujours pas, Lutinore prend le relais

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Le plus simple possible:


private static void Main( )


{


try


{


IDataObject data = Clipboard.GetDataObject( );


if ( data.GetDataPresent( DataFormats.Bitmap ) )


{


Bitmap bmp = ( Bitmap )data.GetData( DataFormats.Bitmap );


bmp.Save( "Capture " + DateTime.Now.Ticks + ".bmp" );


}


}


catch( Exception ex )


{


MessageBox.Show( ex.Message );


}


}
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Salut,
Tu peux déclarer une variable privée qui va te servir de compteur.
Chaque fois que tu fais un enregistement, tu incrémentes ta variables de 1.
Et tu sauves en faisant comme ceci :


string path = string.Format(@"C:\Documents and Settings\All Users\Bureau\Test{0}.bmp", this._myCounter)
img.Save(path);

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

MainForm.cs(21,90): error CS0026: Le mot clé this n'est pas valide dans un initialiseur de propriété statique, de méthode statique ou de champ statique
MainForm.cs(22,9): error CS0246: Le type ou le nom d'espace de noms 'img' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)

Voilà ce que me dit mon Compiler une fois que j'ai ajouté ce que tu viens de me dire :/
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

J'ai oublié de préciser (on sait jamais) je débute ..
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Bon voilà en gros :

public class MainForm : System.Windows.Forms.Form
{
private int _counter = 0;

public static void Main(string[] args)
{
IDataObject iData = Clipboard.GetDataObject();
Bitmap img = (Bitmap) iData.GetData(DataFormats.Bitmap);
img.Save (@"C:\Documents and Settings\All Users\Bureau\Test.bmp");
}

private void CopyClipboardOnDesktop()
{
Bitmap img = iData.GetData(DataFormats.Bitmap) as Bitmap;
if(img != null)
{
string path = string.Format(@"C:\Documents and Settings\All Users\Bureau\Test{0}.bmp", this._counter);
img.Save(path);
this._counter++;
}
}
}

Maintenant tu as une méthode qui permet de copier sur le bureau sans écraser...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Bon en fait je viens de relire ta question, et ce que je t'ai posté ne vas pas marcher...
Pourquoi relancer le programme chaque fois que tu fais un print screen?


Je te conseille plutôt de faire une form avec un bouton dessus, et quand tu cliques sur le boutton, ça enregistre l'image qu'il y a éventuellement dans le Clipboard sur le bureau. Comme ça tu es quittes de chaque fois lancer le programme, et tu peux utiliser la méthode que j'ai postée ci-dessus :


Fais un bouton, et dans l'event clique associé tu appelles la méthode : this.CopyClipboardOnDesktop();
Les images ne seront pas écrasées tant que tu ne fermes pas le programme bien sur...

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

c:\Documents and Settings\Machjaghjolu\Mes documents\SharpDevelop Projects\Final\MainForm.cs(29,27): error CS0246: Le type ou le nom d'espace de noms 'iData' est introuvable (une directive using ou une référence d'assembly est-elle manquante ?)

Désolé mais jsuis encore là avec ce message lol
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

Non justement, c'est un ami à moi qui veut ça pour un programme Flash, il ne veut pas qu'on voye le programme (j'ai un modèle où je peux rentrer chaque fois le nom mais on voit la console).

C'est pour celà qu'il faut que j'arrive à faire ce que je dis (c'est à dire ne pas écraser à chaque fois le fichier)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Dans ce cas la, s'il faut à chaque fois redémarrer le programme, tu es obligé de regarder si le fichier existe en faisant un File.Exist(myPath). S'il est pas existant, suffit de le créer.
S'il existe, tu récupères le numéro, tu l'incrémentes de 1 et tu écris le nouveau fichier.
Okay ?

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

Oui c'est ce qu'on disait .. Mais euh .. Comment je fais ?

Vraiment désolé mais projet urgent et je suis encore en train d'apprendre les bases bases :/
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

Ps: Le File.Exist que j'ai il me semble qu'il est bon regarde
Je l'ai testé ce programme et il est bon mais il est pas efficace car ça s'arrête avec le Test1..

using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;

namespace CaptureScreen
{
public class MainForm : System.Windows.Forms.Form
{
public MainForm()
{
InitializeComponent();
}

[STAThread]
public static void Main(string[] args)
{
if
(File.Exists(@"C:\Documents and Settings\All Users\Bureau\Test.bmp"))
{
IDataObject iData = Clipboard.GetDataObject();

Bitmap img = (Bitmap) iData.GetData(DataFormats.Bitmap);

img.Save (@"C:\Documents and Settings\All Users\Bureau\Test1.bmp");
}
else
{ IDataObject iData = Clipboard.GetDataObject();

Bitmap img = (Bitmap) iData.GetData(DataFormats.Bitmap);

img.Save (@"C:\Documents and Settings\All Users\Bureau\Test.bmp");
}

}

}
}
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
Salut, tu peux rajouter la date et l'heure au nom de ton fichier pour être sûr d'avoir un nom différent à chaque fois..
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

Comment faire pour mettre la date et l'heure?

Désolé Bidou merci de m'aider mais pour le moment la technique la plus simple est préférable en tout cas merci.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Ben tu fais :
string file = string.Format(@"C:\Documents and Settings\All Users\Bureau\Test{0}.bmp", DateTime.Now);

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

Merci, je vais faire avec :)

C'est pas grave je vais pas vous embêter plus longtemps mais quand je compile tout passe mais quand je test le programme il me sort une fenêtre avec écrit:

L'application a généré une exception non gérée.
ID processus=0x9a0 (2464), ID thread=0x140(320)

... Je suis envahi lol
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

Ps: avec les 2 solutions proposées pour la date et l'heure j'ai ce message
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
La dernière fonction de Bidou marche chez moi.. ( En changeant le chemin bien sûr ). Une exception non gerée c'est parce que tu n'utilises pas les blocs try/catch.
Messages postés
92
Date d'inscription
dimanche 31 octobre 2004
Statut
Membre
Dernière intervention
10 octobre 2005

D'accord merci, bon on dira que c'est bon :) (je vais voir comment on s'occupe des Try/Catch je vais pas vous faire chier lol)

Thks