Атомарный удаляют для большого объема файлов

Экстренное сообщение (27.02.2009, сначала сообщаемый MarkJ)

Оператор Поддержки для Visual Basic 6.0 на Windows Vista, Windows Server 2008 и Windows 7

"Базовое время выполнения Visual Basic 6.0 будет поддерживаться в течение целого времени жизни Windows Vista, Windows Server 2008 и Windows 7"

Примечание: MarkJ отправил ответ ниже (перед моим обновлением), который нужно рассмотреть как официальный ответ для этого потока. Пойдите upvote это;)

(Первоначальный ответ)

Время выполнения должно поддерживаться для Windows 7, и не после, Если я верю этому запись в блоге Эксперта по Миграции программного обеспечения (январь 2009) ...

я говорил с Paul Yuknewicz, который является Диспетчером Программ в команде Microsoft Visual Basic и кто вполне связан со всем связанным с VB6 и его процессом миграции.
Paul сказал, и я заключаю в кавычки: " время выполнения VB6 будет поставляться и поддерживаемое как часть Windows 7, однако нет никаких планов поставить его в будущих версиях Windows. "

, Как указано в тот же блог , Оператор Поддержки для Visual Basic 6.0 на WindowsВ®Vistaв „ўand WindowsВ®Server 2008в „ў , файлы Visual Basic 6.0 поддержки во время выполнения будут поддерживаться до, по крайней мере, 2018 (Windows Server 2008 вышел в 27 февраля 2008):

Поддерживаемые Файлы Во время выполнения †“Поставлющийся в ОС: Ключевые файлы времени выполнения Visual Basic 6.0, используемые в большинстве сценариев приложения, поставлются в и поддерживаемые в течение времени жизни Windows Vista или Windows Server 2008. Это время жизни составляет пять лет основной поддержки и пять лет расширенной поддержки со времени, когда Windows Vista или Windows Server 2008 поставлются. Эти файлы были протестированы на совместимость как часть нашего тестирования приложений Visual Basic 6.0, работающих на Windows Vista.

я знаю, что это о Vista, но если Windows Seven является больше эволюцией, чем оборот, который может относиться к Windows семь также (ничто официальное хотя).

Однако:

Visual Basic 6.0 IDE будет поддерживаться на Windows Vista и Windows Server 2008 как часть Visual Basic 6.0 Расширенная Политика поддержки до 8 апреля 2008

Так, даже при том, что Вы будете в состоянии продолжить использовать свои приложения Visual Basic 6.0, рано или поздно Вы должны будете или устранить проблему, найденную в одном из них или добавить новую функциональность, которая требуется Вашим бизнесом. И когда в тот день прибывает, Вы столкнетесь с суровой реальностью, что VB6.0 IDE больше не поддерживается .

MarkJ предлагает в комментариях:

"Вы всегда будете в состоянии выполнить VB6 IDE в виртуальной машине, таким образом, это не было бы катастрофически, что IDE не поддерживается"

Действительно, Вы могли запустить сессию Xp со своим любимым старым IDE в нем;) (даже если в этом изображении это запускается от... сессии человечности!)

сопроводительный текст http://www.blogcdn.com/www.downloadsquad.com/media/2008/02/virtualbox-ubuntu.jpg

5
задан György Andrasek 26 October 2009 в 00:34
поделиться

9 ответов

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

  1. Запишите запись в специальный файл (часто называемый «журналом»), в котором перечислены файлы, которые вы собираетесь удалить.
  2. После того, как эта запись будет безопасно записана, убедитесь, что ваш приложение действует так же, как если бы файлы были фактически удалены.
  3. Позже начните удаление файлов, указанных в записи транзакции.
  4. После удаления всех файлов удалите запись транзакции.

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

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

13
ответ дан 18 December 2019 в 05:36
поделиться

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

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

Вы уверены, что вам нужна не просто база данных? Все они имеют встроенные функции фиксации и отката транзакции.

6
ответ дан 18 December 2019 в 05:36
поделиться

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

2
ответ дан 18 December 2019 в 05:36
поделиться

Я думаю, что вы действительно ищете возможность совершить транзакцию. Поскольку диск может записывать только один сектор за раз, вы можете удалять файлы только по одному. Что вам нужно, так это возможность откатить предыдущие удаления, если одно из удалений не произошло успешно. Подобные задачи обычно предназначены для баз данных. Может ли ваша файловая система выполнять транзакции, зависит от того, какую файловую систему и ОС вы используете. NTFS в Windows Vista поддерживает транзакционную NTFS . Я не совсем уверен, как это работает, но это может быть полезно.

Кроме того, существует нечто, называемое теневая копия для Windows, которая в мире Linux называется LVM Snapshot . По сути, это снимок диска в определенный момент времени. Вы можете сделать снимок непосредственно перед удалением, а в случае неудачи скопируйте файлы обратно из снимка. Я создал теневые копии с помощью WMI в VBScript, уверен, что аналогичные API существуют и для C / C ++.

Одна вещь о теневом копировании и LVM Snapsots. Работа над всем разделом. Таким образом, вы не можете сделать снимок только одного каталога. Однако создание снимка всего диска занимает всего пару секунд. Итак, вы бы сделали снимок. Удалите файлы, а затем, если это не удалось, скопируйте файлы обратно из моментального снимка. Это будет медленно, но в зависимости от того, как часто вы планируете откатиться, это может быть приемлемо. Другая идея - восстановить весь снимок. Это может быть хорошо, а может и не быть, так как откатит все изменения на всем диске. Плохо, если там находится ваша ОС или другие важные файлы. Если этот раздел содержит только файлы, которые вы хотите удалить, восстановление всего снимка может быть проще и быстрее.

5
ответ дан 18 December 2019 в 05:36
поделиться

Не могли бы вы просто создать список путей для удаления, записать этот список в файл to_be_deleted.log , убедиться, что файл попал на диск ( fsync () ), затем начните удалять. После того, как все удаления были выполнены, удалите журнал транзакций to_be_deleted.log .

При запуске приложения оно должно проверить наличие to_be_deleted.log и если он там есть, воспроизвести удаления в этом файле (игнорируя ошибку «не существует»).

2
ответ дан 18 December 2019 в 05:36
поделиться

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

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

1
ответ дан 18 December 2019 в 05:36
поделиться

В Windows Vista или новее Transactional NTFS должна делать то, что вам нужно:

HANDLE txn = CreateTransaction(NULL, 0, 0, 0, 0, NULL /* or timeout */, TEXT("Deleting stuff"));
if (txn == INVALID_HANDLE_VALUE) {
  /* explode */
}
if (!DeleteFileTransacted(filename, txn)) {
  RollbackTransaction(txn); // You saw nothing.
  CloseHandle(txn);
  die_horribly();
}
if (!CommitTransaction(txn)) {
  CloseHandle(txn);
  die_horribly();
}
CloseHandle(txn);
1
ответ дан 18 December 2019 в 05:36
поделиться

Основной ответ на ваш вопрос "Нет". Более сложный ответ заключается в том, что для этого требуется поддержка файловой системы, и очень немногие файловые системы имеют такую ​​поддержку. Очевидно NT имеет транзакционную FS, которая поддерживает это. Возможно, BtrFS для Linux также будет поддерживать это.

В отсутствие прямой поддержки, я думаю, что жесткая ссылка, перемещение, удаление - лучшее, что вы можете получить.

1
ответ дан 18 December 2019 в 05:36
поделиться

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

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

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

1
ответ дан 18 December 2019 в 05:36
поделиться