Sigmond Gatt Ответов: 1

Может ли кто-нибудь объяснить, как можно справиться с файлообменом?


Привет ребята,

-Итак, у меня есть приложение, которое будет регистрировать свои данные в abc.txt файл.

-Это приложение разделяется между 15-20 людьми, которые все они должны войти в систему
abc.txt досье тоже.

- У меня есть еще одно приложение, которое будет считывать данные из abc.txt файл для генерации некоторых
статистика об этом приложении

Я покажу вам некоторый код, как я справляюсь с этой штукой с файлшаригом.

в моем логе :
<appender name="TestAppender" type="log4net.Appender.RollingFileAppender">
  <lockingmodel type="log4net.Appender.FileAppender+MinimalLock"/>
  <param name="File" value="c://temp//abc.txt" /> //temporary path for question.
  <param name="AppendToFile" value ="true"/>
  <encoding value="utf-8" />
  <rollingStyle value="Date" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%date %level [%thread] %type.%method   %message%n" />
  </layout>
</appender>



в моем приложении, где я читаю данные из abc.txt для получения статистики :

string[] inputFilePaths = Directory.GetFiles("\\Path to directory where abc.txt is");


           DateTime now = DateTime.Now;
           string[] thisMonth = inputFilePaths.Where(f => IsThisMonth(now, f)).ToArray();

           using (StreamWriter outputStream = new StreamWriter("//path to a file where i want to write a motnh statistics.. abc.txt is included",false))
           {
               foreach (var inputFilePath in inputFilePaths)
               {
                   using (var inputStream = new StreamReader(inputFilePath))
                   {
                      outputStream.Write(inputStream.ReadToEnd());
                   }

               }
           }



Метод, который я использую для вышеупомянутого :
private bool IsThisMonth(DateTime now, string path)
      {
          DateTime dt;
          if (!DateTime.TryParseExact(Path.GetExtension(path),
                                      ".yyyy-MM-dd",
                                      CultureInfo.InvariantCulture,
                                      DateTimeStyles.None,
                                      out dt))
          {
              return true;
          }
          return dt.Year == now.Year && dt.Month == now.Month;
      }



теперь, когда дело доходит до этой линии :
using (var inputStream = new StreamReader(inputFilePath))


появится сообщение об ошибке : S
System.IO.IOException: 'The process cannot access the file '@.txt' because it is being used by another process.'


Что я уже пробовал:

Может ли кто-нибудь объяснить мне, как это работает и каково решение для этого?

Я обнаружил, что мне нужно включить файлообменник, но я понятия не имею, как это сделать.

Спасибо, что помогли мне, и если у вас есть какие-либо вопросы, не стесняйтесь спрашивать меня. Я все еще студент и должен научиться этим вещам, потому что они могут быть полезны в будущем.

TommoDotCommo

Вы проверяли, можете ли вы читать/писать/изменять файл с помощью текстового редактора или Проводника Windows? Это может быть проблема с разрешениями.

Sigmond Gatt

когда я использовал filestream, я делал FIleShare.readwrite, но теперь мне пришлось изменить вещи на streamwriter/reader, и эта проблема всплывает.. может быть, есть способ, которым я могу сделать файлообменник для streamwriter/reader.

1 Ответов

Рейтинг:
1

Sigmond Gatt

Я только что нашел решение :D


Я добавил следующий код :

foreach (var inputFilePath in inputFilePaths)
{
    var fs = File.Open(inputFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
    using (var inputStream = new StreamReader(fs))
    {
       outputStream.Write(inputStream.ReadToEnd());
    }

}


Этот код откроет файл в режиме общего доступа, а затем я конвертирую его в streamreader :)