Каковы наилучшие способы проверить выход файла или нет в веб-приложении? - PullRequest
0 голосов
/ 27 октября 2010

Я создал веб-приложение, которое ежедневно создает и обновляет XML-файл. т.е. создание xml как currentdate.xml. Здесь есть все записи о посещенных пользователем IP-адресах, реферерах, посещенных страницах и некоторых других

То же самое обновление файла от нескольких пользователей одновременно. Итак, какова лучшая практика для проверки существования и обновления файлов.

Я получаю сообщение "Файл используется другим процессом"

Спасибо, Laxmilal

Ответы [ 2 ]

1 голос
/ 27 октября 2010

Я согласен с реакцией Томса: если можете, используйте базу данных.Он предназначен для многопоточного доступа.Если это невозможно по какой-либо причине, попробуйте написать разные файлы, чтобы предотвратить асинхронные исключения.В противном случае вы можете попытаться получить блокировку, например так:

private static readonly object locker = new object();

public static void MyMethodThatWritesToFile()
{
    lock(locker)
    {
        // Do file IO here.
    }
}

Обратите внимание, что это будет работать только в пределах одного AppDomain.Если у вас есть несколько приложений, пишущих в один и тот же файл, вам нужна блокировка всего процесса.

Возможно, вы можете использовать каркас журналирования, такой как CuttingEdge.Logging (например, XmlFileLoggingProvider).Они предназначены для обеспечения безопасности нитей.

1 голос
/ 27 октября 2010

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

Примером может быть это содержимое файла:

Реферер: http://google.com
RefReferrer: http://stackoverflow.com
ошибка: http://meta.com
Реферер: http://yahoo.com

И это довольно простой вопрос.

Вместо этого вы можете использовать основанную на файле базу данных (например, SQLite ) или, конечно, подходящую базу данных (не обязательно RDBMS).

Или в худшем случае вам нужно синхронизировать записи вручную :

static class Stats {
  static object locker = new object();

  public static Write(string someData) {
    lock(locker) {
        using (var stream = File.Open("pathtofile", FileMode.Append, FileAccess.Write, FileShare.ReadWrite))
        using (var writer = new StreamWriter(stream)) {
            writer.WriteLine(someData);
        }
    }
  }
}

ПРИМЕЧАНИЕ здесь:

  • синхронизация обрабатывается в одном и только одном приложении (так что обычно вы не можете иметь несколько процессов, работающих с файлом;
  • вам не нужно проверять, существует файл или нет. FileMode.Append позаботится об этом.

Другой вариант - использовать Log4net , который намного лучше справляется с параллелизмом. Так что вы можете написать свою статистику в виде файлов журнала:

static class Stats {
  private static readonly ILog log = LogManager.GetLogger(typeof (Stats));

  public static Write(string someData) {
    log.Info(someData)
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...