web-dev-qa-db-fra.com

C # - Enregistrement d'un fichier '.txt' dans la racine du projet

J'ai écrit du code qui me demande d'enregistrer un fichier texte. Cependant, je dois le faire enregistrer dans la racine de mon projet pour que tout le monde puisse y accéder, pas seulement moi.

Voici la méthode en question:

private void saveFileToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            string fileName = Microsoft.VisualBasic.Interaction.InputBox("Please enter a save file name.", "Save Game");
            if (fileName.Equals(""))
            {
                MessageBox.Show("Please enter a valid save file name.");
            }
            else
            {
                fileName = String.Concat(fileName, ".gls");
                MessageBox.Show("Saving to " + fileName);

                System.IO.File.WriteAllText(saveScene.ToString(), AppDomain.CurrentDomain.BaseDirectory + @"\" + fileName);
            }
        }
        catch (Exception f)
        {
            System.Diagnostics.Debug.Write(f);
        }
    }

Beaucoup de gens m'ont dit qu'en utilisant AppDomain.CurrentDomain.BaseDirectory contiendrait l'emplacement dynamique de l'emplacement de stockage de l'application. Cependant, lorsque j'exécute cela, rien ne se passe et aucun fichier n'est créé.

Y a-t-il une autre façon de faire cela, ou est-ce que je l'utilise complètement mal?

11
Computoguy

File.WriteAllText nécessite deux paramètres:
Le premier est le FileName et le second est le contenu à écrire

File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory + @"\" + fileName, 
                  saveScene.ToString());

Gardez cependant à l'esprit que l'écriture dans le dossier actuel peut être problématique si l'utilisateur exécutant votre application n'a pas l'autorisation d'accéder au dossier. (Et dans le dernier OS, l'écriture dans les fichiers programme est très limitée). S'il est possible, changez cet emplacement pour ceux définis dans Environment.SpecialFolder enum

Je souhaite également suggérer d'utiliser la classe System.IO.Path lorsque vous devez créer des chemins et non une concaténation de chaînes où vous utilisez le très 'spécifique au système d'exploitation' constante "\" pour séparer les chemins.

Dans votre exemple, j'écrirais

 string destPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory,fileName);
 File.WriteAllText(destPath, saveScene.ToString());
31
Steve

pas besoin d'extra + @"\" faites juste:

AppDomain.CurrentDomain.BaseDirectory + fileName

et remplacer les paramètres

saveScene.ToString()

et

AppDomain.CurrentDomain.BaseDirectory + fileName

votre code doit être:

private void saveFileToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            string fileName = Microsoft.VisualBasic.Interaction.InputBox("Please enter a save file name.", "Save Game");
            if (fileName.Equals(""))
            {
                MessageBox.Show("Please enter a valid save file name.");
            }
            else
            {
                fileName = String.Concat(fileName, ".gls");
                MessageBox.Show("Saving to " + fileName);

                System.IO.File.WriteAllText(AppDomain.CurrentDomain.BaseDirectory +  fileName, saveScene.ToString());
            }
        }
        catch (Exception f)
        {
            System.Diagnostics.Debug.Write(f);
        }
    }

vous pouvez lire sur File.WriteAllTextici :

Paramètres

   path Type: System.String 

       The file to write to.  

   contents Type: System.String

       The string to write to the file.
5
No Idea For Name

À la place d'utiliser AppDomain.CurrentDomain.BaseDirectory vous pouvez le faire de cette façon:

    File.WriteLine("data\\Mytxt.txt", "Success!");

Lorsque vous n'ajoutez rien, le répertoire de base est automatiquement supposé.

0
D J