Avatar billede pk69 Nybegynder
16. september 2013 - 19:29 Der er 6 kommentarer

Kopiere en fil til flere specifikke undermapper med samme navn

Hej,

jeg er nybegynder i kodningens kunst og er stødt på endnu en udfordring.
Jeg har en mappestruktur:

c:\afd a\skabelon
c:\afd b\skabelon
.
.
.
c:\afd g\skabelon

I alle disse mapper der hedder skabelon skal jeg have kopieret filen test.txt over, som jeg har liggende i mappen c:\tmp\test.txt.

Jeg har lavet følgende kode:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace FileCopy
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string fileName = "test.txt";
            string sourcePath = @"c:\TMP\";
            string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
            string[] dirs = Directory.GetDirectories(@"c:\", "Skabelon");
            foreach (string dir in dirs)
               
            {
                String targetPath = System.IO.Directory.GetDirectories(dir);
                String destFile = System.IO.Path.Combine(targetPath, fileName);
                                           
                System.IO.File.Copy(sourceFile, destFile, true);
            }                   
        }
    }
}

Jeg får en "Error 1 Cannot implicitly convert type 'string[]' to 'string'" i linie 29 (String targetPath = System.IO.Directory.GetDirectories(dir);)

Kan nogen hjælpe ?

/PK
Avatar billede Syska Mester
16. september 2013 - 19:34 #1
Fordi "targetPath" er et string[] og System.IO.Path.Combine(string, string) targer 2 strings som du kan se.

Du skal nok loop over dit array for at få den hensigt du vil.
Avatar billede pk69 Nybegynder
16. september 2013 - 20:24 #2
Hvordan får jeg det løst? Det er lidt sort snak (for mig) det du skriver, men du plejer jo at have ret :-)
Avatar billede Syska Mester
16. september 2013 - 20:32 #3
var fileName = "test.txt";
string[] directories = Directory.GetDirectories(@"C:\temp");
foreach (var dir in directories)
{
    string[] strings = Directory.GetDirectories(dir);

    foreach (var subDir in strings)
    {
        string fileNameInSubDir = Path.Combine(subDir, fileName);
        Console.WriteLine(fileNameInSubDir);
    }
}
Avatar billede pk69 Nybegynder
16. september 2013 - 21:21 #4
Jeg har prøvet at omdanne din kode til

string fileName = "test.txt";
            string sourcePath = @"c:\TMP\";
            string sourceFile = Path.Combine(sourcePath, fileName);
                     
            string[] dirs = Directory.GetDirectories(@"c:\", "Skabelon");
            foreach (var dir in dirs)
            {
                string[] strings = Directory.GetDirectories(dir);
                foreach (var subDir in strings)
                {
                    String destFile = Path.Combine(subDir, fileName);
                    MessageBox.Show(destFile);
                }
               
            } 

Det gir ingen fejl, men heller ikke noget resultat. Som jeg læser din kode lister den alle underbiblioteker i c:\temp der har en test.txt fil. Det jeg vil er at få listet alle de biblioteker der indeholder et unederbibliotek der hedder skabelon. Og så kopiere en test.txt fil over i det underbibliotek.
Men jeg kan ikke lige greje hvordan.
Avatar billede pk69 Nybegynder
17. september 2013 - 17:47 #5
Så lykkedes det alligevel at få brygget noget sammen.

var directory = new DirectoryInfo(@"C:\temp");
            string filnavn = "filNavn.txt";
            string kopiering ="Kopierer filen hertil";

            DirectoryInfo[] dirInfos = directory.GetDirectories(@"test", SearchOption.AllDirectories);

            foreach (var fileInfo in dirInfos)
            {
               
                if (fileInfo.FullName.EndsWith(@"test", StringComparison.OrdinalIgnoreCase))
                {
                    String destFile = Path.Combine(fileInfo.FullName, filnavn);
                    MessageBox.Show(destFile, kopiering);
                    File.Copy(@"c:\temp\filNavn.txt", @destFile, true);
                }
            }
Avatar billede Syska Mester
17. september 2013 - 18:58 #6
Næsten samme koncept ... du tager så bare alt "test" directories i din C:\temp mappe ...

I min tog jeg alt i "C:\temp" da du skrev dine mapper lå der ...

Så loopede jeg over de mapper jeg fandt der og sætte filnavnet på:

C:\temp\per
C:\temp\karen

Ville så give 2 stier til:

C:\temp\per\test.txt
C:\temp\karen\test.txt

Men det du har lavet vil sikkert også virker :-)

Jeg er i hvert fald glad for du kom i mål ved egen hjælp .. det var lidt derfor jeg ikke svarede i går ... man lærer bedst ved at tænke lidt over et problem :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester