Каталог блокируется службой Windows после первого File.Move - PullRequest
0 голосов
/ 30 апреля 2019

У меня есть служба Windows, которая отслеживает каталог на наличие новых файлов и, когда файл создается / копируется в этот каталог, переименовывает его и выполняет некоторую обработку.

Я использую File.Move дляпереименуйте файл.

Он отлично работает, когда я использую тот же код из консольного приложения, но теперь, когда он работает как служба Windows.

Код, который инициализирует средства просмотра файлов

public void StartFileSystemWatcher()
        {
            listFileSystemWatcher = new List<FileSystemWatcher>();

            foreach (var customFolder in listFolders)
            {
                var dir = new DirectoryInfo(customFolder.FolderPath);

                if (customFolder.FolderEnabled && dir.Exists)
                {
                    var fileSWatch = new FileSystemWatcher
                    {
                        Filter = customFolder.FolderFilter,
                        Path = customFolder.FolderPath,
                        NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName,
                        EnableRaisingEvents = true
                    };
                    fileSWatch.Created += (senderObj, fileSysArgs) => FileSWatch_Created(senderObj, fileSysArgs, customFolder.VSTSUrl);
                    listFileSystemWatcher.Add(fileSWatch);

                    logger.Info(string.Format("Starting to monitor files with extension ({0}) in the folder ({1})", fileSWatch.Filter, fileSWatch.Path));
                }
                else
                {
                    logger.Info(string.Format("File system monitor cannot start because the folder ({0}) does not exist", customFolder.FolderPath));
                }
            }
        }

private void FileSWatch_Created(object sender, FileSystemEventArgs e, string vstsUrl)
        {
            PostFileInfoToVSTS(e.FullPath, vstsUrl);
        }

Код, который запускается при создании файла


        private void PostFileInfoToVSTS(string filePath, string vstsUrl)
        {
            try
            {
                var fileName = filePath.Substring(filePath.LastIndexOf("\\") + 1);
                var fileParts = fileName.Split(new char[] { '.' });
                if (fileParts.Length == 6)
                {
                    //rename the file
                    var fileNewName = $"{fileParts[2]}.{fileParts[3]}.{fileParts[4]}.TXT";
                    var fileNewPath = $"{Path.GetDirectoryName(filePath)}\\oldfiles\\{fileNewName}";
                    File.Move(filePath, fileNewPath);

                    //prepare vsts request
                    var request = new VSTSRequest();
                    request.Variables.Region.Value = fileParts[0];
                    request.Variables.Sparc.Value = fileParts[1];
                    request.Variables.SystemName.Value = fileParts[2];
                    request.Variables.Type.Value = fileParts[3];
                    request.Variables.Name.Value = fileParts[4];
                    request.Variables.Filename.Value = fileNewName;

                    var httpWebRequest = (HttpWebRequest)WebRequest.Create(vstsUrl);
                    httpWebRequest.ContentType = "application/json";
                    httpWebRequest.Method = "POST";
                    httpWebRequest.Headers.Add("Authorization", ConfigurationManager.AppSettings["VSTSAuthentication"]);

                    //post to vsts
                    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
                    {
                        streamWriter.Write(JsonConvert.SerializeObject(request));
                        streamWriter.Flush();
                        streamWriter.Close();
                    }

                    //read response
                    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
                    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                    {
                        var result = streamReader.ReadToEnd();
                        var json = JsonConvert.DeserializeObject<dynamic>(result);

                        logger.Info($"File '{fileNewPath}' processed. ReleaseId: {json.id}.");
                    }
                }
                else
                {
                    logger.Info($"File '{fileName}' wasn't processed. Name is not in the correct format.");
                }
            }
            catch (Exception ex)
            {
                logger.Error(ex);
            }
        }

При первом копировании файла в этот каталог он работает нормально, но в следующий раз я получаю Систему.IO.IOException: процесс не может получить доступ к файлу, потому что он используется другим процессом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...