Po skopiowaniu pliku .dll jest on ciągle w użyciu

0

Witam.
W mojej aplikacji sprawdzam czy plik już istnieje. Jeżeli tak kopiuję go dodając do nazwy 1,2,3 itd. Problem występuje tylko z plikami dll. Wszystkie pliki tekstowe, zdjęcia, pdf mogę normalnie usunąć ale pliki dll są ciągle w użyciu. Aplikacja ma też funkcję szyfrowania. Jeżeli zamiast kopiować plik zaszyfruję go to również będę mógł go usunąć. Pliki kopiowane są tylko na chwilę do tymczasowego folderu wybranego przez użytkownika. Próbowałem w pętli while czekać aż proces zwolni mi do nich dostęp ale to nie działa. Ręcznie wywołałem GC też nic.
Ma ktoś jakiś pomysł? Ciekawi mnie dlaczego dotyczy to tylko plików *.dll.

0

Pod Windows nie można usunąć pliku .dll albo .exe jeżeli jest załadowany (jako kod wykonywalny) przez jakikolwiek proces.
Nie bo nie i żadne prawa administratora nie pomogą.

Jeśli dostajesz błąd że plik jest w użyciu to znaczy że jest w użyciu. Zatem trzeba sprawić, by nie był.
Pytanie w jaki sposób - i czy - go ładujesz, czy to jest dll natywny czy dotnetowy, itp.

0

Jedyną operacją jaką przeprowadzam na tym pliku jest File.Copy, po skopiowaniu jest on nagrywany na płytę używając IMAPI. Po nagraniu plik próbuję usunąć File.Delete. Jest to dll natywne całkowicie losowe nagrywane tylko w celach testowych.

0

Możesz sprawdzić Process Explorerem co trzyma uchwyt do pliku.

0

Może antywirus ci skanuje plik.

0

Z Process Explorera dowiedziałem się tyle że to mój program ciągle trzyma uchwyt na tym pliku.

 if (ifFileExist(fileOnDisk.getName(),arrDrive) || ifFileExistOnTemp(fileOnDisk.getName(),filesTemp))
                    {
                        int x = 0;
                        do
                        {
                            ++x;
                        } while (ifFileExist(x + fileOnDisk.getName(), arrDrive) || ifFileExistOnTemp(x + fileOnDisk.getName(), filesTemp));

                        File.Copy(fileOnDisk.getfullPath(), fileOnDisk.getfullPath().Substring(0, fileOnDisk.getfullPath().LastIndexOf('\\') + 1) + x + fileOnDisk.getName());
                        filesTemp.Add(x + fileOnDisk.getName());
                        filescopy.Add(new FileClass(fileOnDisk.getfullPath().Substring(0, fileOnDisk.getfullPath().LastIndexOf('\\') + 1) + x + fileOnDisk.getName(), x + fileOnDisk.getName(), fileOnDisk.getSize()));
                        filesToRemove.Add(new FileClass(fileOnDisk.getfullPath().Substring(0, fileOnDisk.getfullPath().LastIndexOf('\\') + 1) + x + fileOnDisk.getName(), x + fileOnDisk.getName(), fileOnDisk.getSize()));

                        using (StreamWriter sw = File.AppendText(@"Logs\FilesOnDisk.txt"))
                        {
                            sw.WriteLine(fileOnDisk.getfullPath()  + '?' + x+fileOnDisk.getName() + '?' + fileOnDisk.getSize());
                        }
                    }
                    else
                    {
                        filesTemp.Add(fileOnDisk.getName());
                        filescopy.Add(new FileClass(fileOnDisk.getfullPath().Substring(0, fileOnDisk.getfullPath().LastIndexOf('\\') + 1)  + fileOnDisk.getName(),  fileOnDisk.getName(), fileOnDisk.getSize()));

                        using (StreamWriter sw = File.AppendText(@"Logs\FilesOnDisk.txt"))
                        {
                            sw.WriteLine(fileOnDisk.getfullPath() + '?' + fileOnDisk.getName() + '?' + fileOnDisk.getSize());
                        }

                    }
 foreach(FileClass fc in prepareFiles.getFilesToRemove())
                    {
                        File.Delete(fc.getfullPath());
                    }

To są miejsca w których operuję na tych plikach. Ma ktoś pomysł co może to powodować?

0

Co to jest FileClass i co robi?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0