none
Il processo non può accedere al file perchè in uso in un altro processo RRS feed

  • Domanda

  • Buongiorno,

    sono conscio del fatto che il problema è già stato affrontato ma nonostante abbia spulciato qua e la in cerca di soluzioni purtroppo mi trovo costretto a chiedere il vostro aiuto.

    Sostanzialmente sto usando la procedura trovata su MSDN per copiare con C# il contenuto di una cartella in un' altra cartella, e il tutto funziona correttamente fintanto che non provo ad implementare un file di log nel quale vengono scritte le operazioni eseguite dal flusso. La cartella è una cartella di test con 2 file e una sottocartella contenente altri file.

    La cosa strana è che il processo riesce a completare la copia dei file ma si pianta sulla copia della sottocartella. Infatti nel file di log viene scritta l'esecuzione della copia dei file e poi arriva il fatidico msg "Il processo non può accedere al file ..\log.txt perchè in uso in un altro processo". Mentre come detto precedentemente se io levo "using" e i vari log.writeline funziona tutto correttamente.

    Il codice è il seguente:

    class Program
        {
            static void Main(string[] args)
            
            {
                DirectoryCopy(@"C:\Users\g.ruffo\Documents\CartellaTest\Test2", @"C:\Users\g.ruffo\Desktop\CartellaTest\Test3", true);
            }

            private static void DirectoryCopy(
            string sourceDirName, string destDirName, bool copySubDirs)
            {
                using (System.IO.StreamWriter log = File.AppendText(@"C:\Users\g.ruffo\Desktop\CartellaTest\log.txt"))
                {
                    try
                    {
                        DirectoryInfo dir = new DirectoryInfo(sourceDirName);
                        DirectoryInfo[] dirs = dir.GetDirectories();

                        // If the source directory does not exist, throw an exception.
                        if (!dir.Exists)
                        {
                            throw new DirectoryNotFoundException(
                                "Source directory does not exist or could not be found: "
                                + sourceDirName);
                        }

                        // If the destination directory does not exist, create it.
                        if (!Directory.Exists(destDirName))
                        {
                            Directory.CreateDirectory(destDirName);
                        }

                        // Get the file contents of the directory to copy.
                        FileInfo[] files = dir.GetFiles();

                        foreach (FileInfo file in files)
                        {
                            // Create the path to the new copy of the file.
                            string temppath = Path.Combine(destDirName, file.Name);

                            // Copy the file.
                            file.CopyTo(temppath, false);
                            
                            log.WriteLine(file + " copied to " + temppath);
                            log.WriteLine(DateTime.Now.ToString("yyyy-dd-M- -HH-mm-ss"));
                            log.WriteLine("--------");
                        }

                        // If copySubDirs is true, copy the subdirectories.
                        if (copySubDirs)
                        {

                            foreach (DirectoryInfo subdir in dirs)
                            {
                                // Create the subdirectory.
                                string temppath = Path.Combine(destDirName, subdir.Name);

                                // Copy the subdirectories.
                                DirectoryCopy(subdir.FullName, temppath, copySubDirs);

                                log.WriteLine(subdir + " copied to " + temppath);
                                log.WriteLine(DateTime.Now.ToString("yyyy-dd-M- -HH-mm-ss"));
                                log.WriteLine("--------");
                            }
                        }
                    }
                    catch (IOException exp)
                    {
                        log.WriteLine(exp.Message);
                        log.WriteLine(DateTime.Now.ToString("yyyy-dd-M- -HH-mm-ss"));
                        log.WriteLine("--------");
                    }
                    log.Close();
                } //chiusura StreamWriter
            }
        }

    martedì 12 novembre 2019 10:37

Risposte

  • [RISOLTO]

    Dal momento che non ho trovato il modo di far funzionare ne la soluzione using() ne lo streamwriter che mandi in output il contenuto della console ho optato (sono stato aiutato lo ammetto) di racchiudere lo streamwriter all'esterno del blocco DirectoryCopy quindi ho creato questo blocco:

    static void ScriviLog(string riga)
            {
                Console.WriteLine(riga);
                StreamWriter
                    srLog = new StreamWriter(@"C:\Users\g.ruffo\Downloads\CartellaTest\log.txt", true);
                srLog.WriteLine(riga);
                srLog.Close();
            }

    Adesso richiamando la funzione ScriviLog(contenuto) dove mi serve ad esempio per salvare i nomi dei file copiati all'interno del ciclo foreach, riesco a salvare tutto correttamente nel file log.txt

    giovedì 14 novembre 2019 11:16

Tutte le risposte

  • Faccio un piccolo update per sottolineare che dopo numerosi tentativi non ho ancora risolto ma ho trovato questa cosa, facendo scrivere ogni passaggio tramite Console.WriteLine ottengo che il processo si termina correttamente in questa maniera:

    index.html copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\index.html
    2019-13-11- -09-55-51
    --------
    style.css copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\style.css
    2019-13-11- -09-55-51
    --------
    images (3).jpg copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\img\images (3).jpg
    2019-13-11- -09-55-51
    --------
    images (4).jpg copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\img\images (4).jpg
    2019-13-11- -09-55-51
    --------
    images (5).jpg copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\img\images (5).jpg
    2019-13-11- -09-55-51
    --------

    E' una cartella di test, quelle vere contengono molti più file e sottocartelle. Ad ogni modo, ho deciso di togliere using(streamWriter) per salvare direttamente il contenuto della console nel file log.txt pensando che avrebbe risolto e invece il messaggio è sempre quello, dopo aver fatto la copia dei primi due file:

    index.html copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\index.html
    2019-13-11- -09-57-36
    --------
    style.css copied to C:\Users\g.ruffo\Desktop\CartellaTest\Test3\style.css
    2019-13-11- -09-57-36
    --------
    Il processo non può accedere al file 'C:\Users\g.ruffo\Desktop\CartellaTest\log.txt' perché è in uso da un altro processo.
    2019-13-11- -09-57-36
    --------



    mercoledì 13 novembre 2019 09:27
  • Buongiorno Guglielmo,

    La cosa importante da capire e' quale processo sta usando log.txt.
    Una volta che questo sia chiaro, potrebbe essere risolto. 

    Qui, potresti trovare informazioni su come capire il problema.
    Process Explorer mostra informazioni su quali handle e processi DLL sono stati aperti o caricati.



    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    giovedì 14 novembre 2019 09:47
    Moderatore
  • [RISOLTO]

    Dal momento che non ho trovato il modo di far funzionare ne la soluzione using() ne lo streamwriter che mandi in output il contenuto della console ho optato (sono stato aiutato lo ammetto) di racchiudere lo streamwriter all'esterno del blocco DirectoryCopy quindi ho creato questo blocco:

    static void ScriviLog(string riga)
            {
                Console.WriteLine(riga);
                StreamWriter
                    srLog = new StreamWriter(@"C:\Users\g.ruffo\Downloads\CartellaTest\log.txt", true);
                srLog.WriteLine(riga);
                srLog.Close();
            }

    Adesso richiamando la funzione ScriviLog(contenuto) dove mi serve ad esempio per salvare i nomi dei file copiati all'interno del ciclo foreach, riesco a salvare tutto correttamente nel file log.txt

    giovedì 14 novembre 2019 11:16
  • Grazie del feedback Gugliemo!

    • Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto fornito “as is“ non comporta alcuna responsabilità da parte dell’azienda.

    giovedì 14 novembre 2019 11:35
    Moderatore