En général, j'obtiens cette erreur : (Le service "nom du service" de l'ordinateur local a démarré puis s'est arrêté. Certains services s'arrêtent automatiquement s'ils ne sont pas utilisés par d'autres services ou programmes) lorsqu'il y a un problème avec mon code, comme des chemins d'accès inexistants, etc. Le service Windows ne démarre pas.
J'ai un service Windows qui sauvegarde les dossiers/fichiers, vers un emplacement s'il a atteint la limite de taille. Tous les détails sont fournis par une configuration XML que le service Windows lit au démarrage. J'ai un formulaire Windows séparé qui contient un bouton qui fait exactement ce que fait le service Windows au démarrage. J'utilise mes formulaires Windows pour déboguer le code avant de le mettre dans mon service Windows.
Lorsque je lance mes formulaires Windows. Il fait ce qu'il est censé faire. Quand j'ai mis mon code dans la méthode OnStart() du service Windows, l'erreur est apparue.
Voici mon code :
protected override void OnStart(string[] args)
{
private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";
protected override void OnStart(string[] args)
{
if (File.Exists(backupConfig))
{
FileSystemWatcher watcher = new FileSystemWatcher();
XmlTextReader reader = new XmlTextReader(backupConfig);
XmlNodeType type;
List<string> listFile = new List<string>();
string fileWatch = "";
//this loop is for reading XML elements and assigning to variables
while (reader.Read())
{
type = reader.NodeType;
if (type == XmlNodeType.Element)
{
if (reader.Name == "File")
{
reader.Read();
fileWatch = reader.Value;
}
else if (reader.Name == "Folder")
{
reader.Read();
fileWatch = reader.Value;
}
}
}
reader.Close();
watcher.Path = fileWatch;
watcher.Filter = "*.*";
//this loop reads whether the service will watch a file/folder
XmlTextReader reader1 = new XmlTextReader(backupConfig);
while (reader1.Read())
{
type = reader1.NodeType;
if (type == XmlNodeType.Element)
{
if (reader1.Name == "File")
{
watcher.IncludeSubdirectories = false;
watcher.Changed += new FileSystemEventHandler(OnChangedFile);
}
else if (reader1.Name == "Folder")
{
watcher.IncludeSubdirectories = true;
watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
}
}
}
reader1.Close();
watcher.EnableRaisingEvents = true;
}
else
{
StreamWriter sw = new StreamWriter(serviceStat, true);
sw.WriteLine("File not found. Please start the Log Backup UI first.");
sw.Close();
}
}
Je ne sais pas ce qui fait que le service Windows ne démarre pas, le simulateur de formulaire Windows fonctionnait bien. Quel semble être le problème ?
MISE À JOUR : Après de nombreux essais, j'ai remarqué qu'en utilisant uniquement un répertoire de dossiers (sans fichier), le service Windows ne fonctionne pas. Lorsque j'ai remplacé la variable fileWatch par un fichier spécifique (y compris son répertoire), le service Windows a démarré. Lorsque j'ai remplacé la variable par un emplacement de dossier, il n'a pas fonctionné. Ce que je pense, c'est que l'emplacement des dossiers ne fonctionne pas dans un filewatcher.
Lorsque j'ai essayé de créer un nouveau service Windows qui surveille un emplacement de dossier, cela a fonctionné . Cependant, lorsque j'ai essayé le même emplacement dans mon service Windows original, cela n'a pas fonctionné ! Je n'en revenais pas ! Il semble que je doive créer un nouveau service Windows et construire l'installateur chaque fois que je place un nouveau code/fonction De cette façon, je peux garder la trace des endroits où j'obtiens une erreur.