Файл не доступен, потому что он используется другим процессом c # - PullRequest
0 голосов
/ 05 октября 2018

Я написал службу Windows для копирования файла CSV из исходного местоположения в новое местоположение.

После этого CSV в новом местоположении был прочитан и записал данные в MySQL.

Вышеуказанные задачи выполнялись как две отдельные службы, поскольку служба перемещения файлов вызывает ошибку:

{"Процесс не может получить доступ к файлу 'C: \ data.csv', поскольку ониспользуется другим процессом. "}

Следовательно, я решил объединить 2 службы в 1, но все же у меня возникла та же проблема.

Мой код выглядит следующим образом.

program.cs

   public void Insert()
        {
                if (this.OpenConnection() == true)
                {
                      using(var reader = new StreamReader(@"C:\data.csv"))
                    {
                        List<string> listA = new List<string>();

                        while (!reader.EndOfStream)
                        {
                            var line = reader.ReadLine();
                            var values = line.Split(',');
                            string querynew = "INSERT INTO new_jobs"
                                      + "(job_reference,status)" 
                                      + "VALUES (?jobNo, ?strClientName)";

                                MySqlCommand cmd = connection.CreateCommand();
                        cmd.CommandText= querynew;
                                cmd.Parameters.Add("?jobNo", MySqlDbType.VarChar).Value = (values[0]);
                                cmd.Parameters.Add("?strClientName", MySqlDbType.VarChar).Value =(values[1]);

                        cmd.ExecuteNonQuery(); 
                       56 filemove(); <-- error trigger line
                        }
                    }
                    this.CloseConnection();
                }

// функция перемещения файла

 public void filemove()
            {
                string fileName = "data.csv";
               string sourcePath = @"\\Data\Company Files\";

                string targetPath = @"C:";

           string sourceFile = System.IO.Path.Combine(sourcePath, fileName);
            string destFile = System.IO.Path.Combine(targetPath, fileName);

          //I won't include the whole code in this method since it's too lengthy.



            }

Service.cs

Я не включаю остальную часть кода в методы.

void timer1_Tick(object sender, ElapsedEventArgs e)
        {

               dbConnect.Truncate();
                dbConnect.Insert();
                dbConnect.filemove();
        }

  protected override void OnStart(string[] args)
        {
            dbConnect.Insert();
            dbConnect.filemove();
        }

Ошибка запускается в строке 56 внутри метода Insert ().

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Непонятно, что происходит в методе filemove (), чтобы вызвать ошибку, вероятно, это еще дальше в той части, которая не была включена.При этом вы можете попытаться переместить вызов filemove () после использования блока StreamReader (как показано ниже).С его помощью в блоке использования StreamReader все еще имеет открытый файл и может ограничить то, что происходит в filemove ().

public void Insert()
{
    if (this.OpenConnection() == true)
    {
        using(var reader = new StreamReader(@"C:\data.csv"))
        {
            List<string> listA = new List<string>();

            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(',');
                string querynew = "INSERT INTO new_jobs"
                    + "(job_reference,status)" 
                    + "VALUES (?jobNo, ?strClientName)";

                MySqlCommand cmd = connection.CreateCommand();
                cmd.CommandText= querynew;
                cmd.Parameters.Add("?jobNo", MySqlDbType.VarChar).Value = values[0]);
                cmd.Parameters.Add("?strClientName", MySqlDbType.VarChar).Value = (values[1]);
                cmd.ExecuteNonQuery(); 
            }
        }
        filemove(); // move this here after the using block
        this.CloseConnection();
    }
}
0 голосов
/ 05 октября 2018

Когда вы открываете свой файл для чтения или записи или чего-то еще, вам нужно убедиться, что он открыт для совместного использования с другими процессами.Для этого есть Enum, который называется FileShare !Попробуйте это:

  using (var stream = new FileStream(@"C:\data.csv",FileMode.Open, FileAccess.Read, 
            FileShare.ReadWrite)
            {
              using(var reader = new StreamReader(stream))
                {
                    List<string> listA = new List<string>();

                    while (!reader.EndOfStream)
                    {
                        var line = reader.ReadLine();
                        var values = line.Split(',');
                        string querynew = "INSERT INTO new_jobs"
                                  + "(job_reference,status)" 
                                  + "VALUES (?jobNo, ?strClientName)";

                            MySqlCommand cmd = connection.CreateCommand();
                    cmd.CommandText= querynew;
                            cmd.Parameters.Add("?jobNo", MySqlDbType.VarChar).Value = 
                                      (values[0]);
                            cmd.Parameters.Add("?strClientName", MySqlDbType.VarChar).Value =(values[1]);

                    cmd.ExecuteNonQuery(); 
                   56 filemove(); <-- error trigger line
                    }
                }
             }
0 голосов
/ 05 октября 2018

Сначала закройте соединение, а затем позвоните.

    public void Insert()
    {
            if (this.OpenConnection() == true)
            {
                  using(var reader = new StreamReader(@"C:\data.csv"))
                {
                    List<string> listA = new List<string>();

                    while (!reader.EndOfStream)
                    {
                        var line = reader.ReadLine();
                        var values = line.Split(',');
                        string querynew = "INSERT INTO new_jobs"
                                  + "(job_reference,status)" 
                                  + "VALUES (?jobNo, ?strClientName)";

                            MySqlCommand cmd = connection.CreateCommand();
                    cmd.CommandText= querynew;
                            cmd.Parameters.Add("?jobNo", MySqlDbType.VarChar).Value = (values[0]);
                            cmd.Parameters.Add("?strClientName", MySqlDbType.VarChar).Value =(values[1]);

                    cmd.ExecuteNonQuery(); 

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