[C#] Ecrasement fichier.. [Résolu]

cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 21:25 - Dernière réponse :  cs_coq
- 3 juil. 2005 à 10:08
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");

            }

    }

}

Afficher la suite 

Votre réponse

35 réponses

Meilleure réponse
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 22:49
3
Merci
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

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 23:08
3
Merci
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

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de cs_Bidou
Meilleure réponse
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 3 juil. 2005 à 00:14
3
Merci
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 );


}


}

Merci Lutinore 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de Lutinore
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 21:31
0
Merci
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
Commenter la réponse de cs_Bidou
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 21:39
0
Merci
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 :/
Commenter la réponse de cs_Machjaghjolu
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 21:41
0
Merci
J'ai oublié de préciser (on sait jamais) je débute ..
Commenter la réponse de cs_Machjaghjolu
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 22:05
0
Merci
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
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 22:09
0
Merci
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
Commenter la réponse de cs_Bidou
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 22:16
0
Merci
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
Commenter la réponse de cs_Machjaghjolu
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 22:19
0
Merci
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)
Commenter la réponse de cs_Machjaghjolu
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 22:29
0
Merci
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
Commenter la réponse de cs_Bidou
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 22:32
0
Merci
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 :/
Commenter la réponse de cs_Machjaghjolu
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 22:33
0
Merci
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");
}

}

}
}
Commenter la réponse de cs_Machjaghjolu
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 2 juil. 2005 à 22:55
0
Merci
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..
Commenter la réponse de Lutinore
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 22:58
0
Merci
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.
Commenter la réponse de cs_Machjaghjolu
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juil. 2005 à 23:01
0
Merci
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
Commenter la réponse de cs_Bidou
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 23:10
0
Merci
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
Commenter la réponse de cs_Machjaghjolu
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 23:11
0
Merci
Ps: avec les 2 solutions proposées pour la date et l'heure j'ai ce message
Commenter la réponse de cs_Machjaghjolu
Lutinore 3248 Messages postés lundi 25 avril 2005Date d'inscription 27 octobre 2012 Dernière intervention - 2 juil. 2005 à 23:24
0
Merci
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.
Commenter la réponse de Lutinore
cs_Machjaghjolu 92 Messages postés dimanche 31 octobre 2004Date d'inscription 10 octobre 2005 Dernière intervention - 2 juil. 2005 à 23:26
0
Merci
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
Commenter la réponse de cs_Machjaghjolu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.