System.Sammlungen.ListDictionaryInternal Fehler
Ich versuche ein Programm erstellen, wo jedes mal, wenn ich eine Textdatei erstellen,wird die Datei komprimiert und melden Sie es .
Es funktioniert für die erste text-Datei, aber wenn ich die zweite bekomme ich diese exception: System.Collections.ListDictionaryInternal
Error:The process cannot access the file 'D:\TemeC#\FilesHomework\FilesHomework\ obj\Debug\New Text Document.txt' because it is being used by another process.
Dies ist mein code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.IO.Compression;
using System.Security.Permissions;
namespace FilesHomework
{
class Program
{
static void Main(string[] args)
{
Run();
}
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
public static void Run()
{
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = "D:";
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
watcher.Filter = "*.txt";
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.EnableRaisingEvents = true;
Console.WriteLine("Press \'q\' to quit the sample.");
while (Console.Read() != 'q') ;
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
try {
FileInfo FileIn = new FileInfo(e.Name);
Compress(FileIn);
//FileStream LogFile = File.Open("LogFile.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.ReadWrite);
// File.SetAttributes("LogFile.txt", FileAttributes.Normal);
// StreamWriter sw = new StreamWriter(LogFile);
string str;
str = ("The file " + e.Name + " has been deleted at " + DateTime.Now);
//byte[] b1 = System.Text.Encoding.UTF8.GetBytes(str);
// sw.WriteLine(str);
Console.WriteLine(str);
File.Delete(e.Name);
// LogFile.Close();
// sw.Close();
}
catch(Exception er)
{
Console.WriteLine("Error:" + er.Data);
}
}
public static void Compress(FileInfo fileSelected)
{
using (FileStream originalFileStream = fileSelected.OpenRead())
{
if ((File.GetAttributes(fileSelected.FullName) &
FileAttributes.Hidden) != FileAttributes.Hidden & fileSelected.Extension != ".gz")
{
using (FileStream compressedFileStream = File.Create(fileSelected.Name+ ".gz"))
{
using (GZipStream compressionStream = new GZipStream(compressedFileStream,
CompressionMode.Compress))
{
originalFileStream.CopyTo(compressionStream);
}
}
}
}
}
}
}
Was denken Sie ich tun soll?
- Poste bitte die vollständigen stack-trace. Im moment alles, was wir wissen über den Fehler ist
System.Collections.ListDictionaryInternal
das ist nicht annähernd genug ins detail. - Herzlich willkommen auf Stack Overflow. Um helfen zu können brauchen wir mehr details. Was ist die exception-Meldung? Können Sie entfernen Sie einige der code und ein minimal-Beispiel das problem?
- Das ist die ausführliche Fehlermeldung. Sorry für vorhin. Fehler:Der Prozess kann nicht auf die Datei zugreifen 'D:\TemeC#\FilesHomework\FilesHomework\ obj\Debug\New Text Document.txt" weil es wird von einem anderen Prozess verwendet.
- die Fehlermeldung klar sagt, dass eine Datei nicht korrekt geschlossen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ahh, ich glaube, ich sehe das problem.
Sieht es aus wie dein code versucht zu Holen, die neue Datei, bevor Sie tatsächlich schließen Sie die Datei in Ihrem editor.
Müssen Sie die Einführung eines Mechanismus in Ihre Compress-Methode, die prüft, ob die Datei vorhanden ist, zum ersten mal öffnen.
Finden Sie diese Antwort, um zu überprüfen, ob eine Datei zugegriffen werden kann oder nicht, in code:
Gibt es eine Möglichkeit zu überprüfen, ob eine Datei in Benutzung ist?
Edit:
Ich würde auch versuchen Sie, die FileSystemWatcher-Ereignis aus, das Sie verwenden werden .Geändert, Brände, die nach einem Datei-Attribut geändert wird.
Ich würde noch prüfen, können Sie diese Öffnen und Lesen, indem Sie den link oben, obwohl.