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

Обновлено: 05.07.2024

Яндекс.Диск не может загрузить файл на сервер в следующих случаях:

ваш компьютер не подключен к интернету;

место на Диске закончилось;

в настройках Яндекс.Диска отключена синхронизация;

размер файла, который необходимо синхронизировать, больше 50 ГБ;

доступ к файлу ограничен (например, файл используется другой программой).

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

Программа зависла в статусе «Идёт синхронизация»

Измените длинные названия файлов в папке Яндекс.Диска на более короткие. Проверьте, есть ли у программы стабильный доступ в сеть (антивирусы и файрволы могут блокировать соединение).

Чаще всего это происходит по следующим причинам:

Папка синхронизации недоступна

Выбранная для синхронизации папка недоступна для чтения или удалена. Проверьте, на месте ли эта папка, или выберите другую.

Конфликт папки синхронизации

Указанная в настройках программы папка уже используется с другой учётной записью Диска. Использовать одну и ту же папку для синхронизации с разными аккаунтами нельзя. Выберите другую папку в настройках программы.

Папка синхронизации не выбрана

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

Низкая скорость синхронизации

Скорость синхронизации рассчитывается с учетом экономии трафика и ресурсов системы. Также скорость может ограничиваться вашим провайдером — проверьте скорость соединения с интернетом.

Я отключил синхронизацию, но файлы все равно попадают на Диск

Чужие файлы могут попасть на ваш Яндекс.Диск, если вы авторизуетесь на чужом мобильном устройстве. В этом случае при включенной автозагрузке файлы с устройства будут загружены на Яндекс.Диск.

Вы можете прекратить загрузку чужих файлов на ваш Яндекс.Диск следующими способами:

Выйти на всех устройствах

Чтобы на ваш Яндекс.Диск не попадали чужие файлы, выйдите из Яндекс.Диска на всех устройствах:

В блоке История входов и устройства нажмите ссылку Выйти на всех устройствах .

Также вы можете отозвать доступ программ и приложений Яндекс.Диска к вашим файлам на сервере:

возможно ли, чтобы 2 приложения записывались в один и тот же файл журнала с помощью log4net?

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

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

MinimalLock частично решает проблему (как упоминалось в @Mark), но если вы используете RollingFileAppender, вы столкнетесь с другими проблемами. Когда файл катится, вы можете оказаться в состоянии гонки, где один процесс перезаписывает новый файл журнала другого процесса.

другие опции включают RemoteLogger, где у вас есть простой сервер, настроенный для приема и записи событий журнала, отправленных другими процессами. Аналогичным образом можно войти в базу данных SQL. Я написал простую добавил эти журналы в Redis; вам понадобится простое приложение для чтения из Redis и записи в файл. Проблема с этими подходами заключается в том, что все они вводят точку отказа. Когда что-то не работает правильно, часто вам нужны журналы больше всего, и тогда они могут быть недоступны.

таким образом, мое решение состояло в том, чтобы полностью избежать проблемы, имея каждый журнал процессов в свой собственный файл. Это было легко сделать с изменением конфигурации. В (Rolling)FileAppender настройки, использовать:

идентификатор процесса становится частью имени файла. Да, это означает, что теперь у вас есть несколько файлов журнала, но агрегатор файлов журнала, такой как Graylog, Splunk или Logscape, может помочь.

зависит от FileAppender ' s LockingModel. Если это ExclusiveLock затем другой процесс не может открыть файл для записи. Альтернатива MinimalLock, но он не предназначен для этой цели. Он предназначен для разрешения другому процессу перемещать или удалять файл.

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

Да, это возможно, как указано выше, но теперь я провел стресс-тестирование этого сценария.

настройка довольно проста:

  1. веб-проект 1 Настройка страницы, которая регистрирует одну запись + кнопка это устанавливает 1000 запросов на ту же страницу, со счетчиком в URL (подхвачен оператором logging).
  2. веб-проект 2 настроен идентично, против того же файла журнала.

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

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

тест был выполнен со значением по умолчанию "MinimalLock". Я также переделал тест с помощью "ExclusiveLock", только чтобы обнаружить, что первый веб-проект для настройки регистратора" выиграл", в основном блокируя все остальные запросы на вход. Так что, очевидно, это тоже не годится.

Задача: Обеспечить параллельную (например, многотерминальную) работу с базой данных нескольких пользователей одновременно.

База данных текстовая, 1 файл, 10+к строк формата знач1;знач2;. ;знач12.

Запускается программа, в listBox выгружаются значения. Далее из программы с ними можно работать (удалить, изменить, добавить). Проблема в том что каждый раз меняя значения, нужно перезаписывать весь файл, поменял строку 5000 к примеру, надо перезаписывать весь файл, так же с удалением. Пока перезаписывается, вторая программа ожидает. Как можно более грамотно решить задачу?

  • Вопрос задан более трёх лет назад
  • 301 просмотр

Для одновременной работы с файлом несколькими приложениями его нужно открывать во всех приложениях со специальным указанием: FileShare.ReadWrite

В этом случае все приложения смогут одновременно читать и писать в файл. Это накладывает определённые ограничения на приложения - они должны как-то договариваться и понимать куда они могут писать, а куда - нет.
Каждая программа должна писать только изменения в файл, а не переписывать его - иначе другие программы отвалятся.
Это большой геморрой. Так делать не надо.
Если вы всё-таки решитесь, то нужно файл разбить на блоки. Перед записью в блок программа будет его помечать, что-бы другие программы ждали, пока вы закончите с ним работать, после записи - сбрасывать пометку. Если данные удалились - нужна пометка, что блок удалён, так как нельзя сдвигать файл - его могут читать другие программы. Если данные увеличились в размере - ставить отметку удаления и записывать новые данные в конец. И тд, и тп.
Большая часть из этого заложено, например, в формат dbf. Но реализовывать всё это придётся руками.
Кроме того остаётся вопрос с синхронизацией изменений. Если вы в одной программе поменяли список - как об этом узнает программа на другом компьютере. Это может быть слежение за временем изменения файла, или за специальными отметками в файле . Постоянные проблемы с синхронизацией, постоянное состояние гонки, взаимоблокировки и т.д. В общем, так делать не надо.
Конечно, если каждой запущенной программе отводится только одна строчка и другие её не трогают, то можно попробовать изменять только её.

Если у вас, в основном, чтения и иногда "точечные" изменения, то можно предложить следующий вариант:
при записи: ожидать завершение всех чтений, а затем блокировать файл с FileShare.None, изменить и отпустить.
при чтении: ожидать завершение записи, если она есть, затем открытие файла с FileShare.Read (это не блокирует другие чтения), быстрое чтение и закрытие файла.
Под ожиданием я понимаю попытку открытия файла с соответствующими параметрами, и в случае исключения повтор через таймаут.

Написать велосипед сервис/сервер, который будет с одной стороны взаимодействовать с программами, с другой писать файл на диск, а внутри - кэшировать это.

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

Каждый раз, когда вы копируете файл в папку Яндекс.Диска, редактируете или удаляете файл, все изменения дублируются на сервере Диска: их можно видеть на сайте Яндекс.Диска. И наоборот — если вы загружаете файлы на сайте, они автоматически отобразятся в программе Яндекс.Диск на вашем компьютере.

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

Примечание. Синхронизировать файлы на телефоне не получится. Скачивать и загружать файлы можно только вручную. Но вы можете включить безлимитную автозагрузку фото и видео.

Как синхронизируются измененные файлы

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

Как использовать Диск на нескольких устройствах

Что происходит, когда файл изменяется одновременно на разных устройствах?

Допустим, вы создали документ document.docx в папке Диска на домашнем ноутбуке, отключенном от интернета, а затем загрузили на Диск файл с тем же именем с рабочего\nкомпьютера.

Когда вы подключите ноутбук к интернету, Яндекс.Диск начнет синхронизацию. Обнаружив разные файлы с одинаковыми именами, Диск переименует один из них: в результате файлы будут называться document.docx и document (2).docx .

На скольких устройствах можно использовать Яндекс.Диск?

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

Скорость синхронизации

Чтобы увидеть, с какой скоростью идет синхронизация, нажмите значок Яндекс.Диска: скорость загрузки и скачивания будет указана во всплывающем окне.

Скорость синхронизации рассчитывается с учетом экономии трафика и ресурсов системы. Также скорость может ограничиваться вашим провайдером — проверьте скорость соединения с интернетом.

Что произойдет, если переместить папку Яндекс.Диска?

Если вы перенесете папку Яндекс.Диска, не указав новое положение в настройках программы, программа создаст папку заново на прежнем месте. Как переместить вашу копию Диска, см. в разделе Как выбрать другую папку для синхронизации с сервером.

Что произойдет, если я удалю файлы из папки Яндекс.Диска?

Когда вы удаляете файлы в программе, они попадают в Корзину и хранятся в ней 30 дней. После этого они автоматически удаляются с сервера. Восстановить удаленные с сервера файлы нельзя. Восстановить файлы из Корзины можно только в веб-интерфейсе Яндекс.Диска.

Внимание. Файлы, перемещенные в Корзину, продолжают занимать место на вашем Диске. Если вам не хватает места, очистите Корзину.

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

Читайте также: