Удалить ссылку на файл без очистки готов
-
27-09-2019 - |
Вопрос
У меня есть набор файлов с несколькими ссылками на них.
Файлы принадлежат источнику TFS, но для них сделаны другие ссылки на них. Как удалить дополнительные ссылки без очистки готовности.
Это безопасно предположить:
- Файлы имеют более одной ссылки на них
- Вы не удаляете имя, принадлежащее TFS
- Там нет потенциальных условий расы
- У вас есть полный контроль ACL для файлов
- Машина не потеряет мощность, и ваша программа не будет убита, если она не будет слишком долго.
Это не безопасно, чтобы предположить:
- Набор готовности (не устанавливайте его, если нет)
- Вы можете покинуть чтенно понятно, если вы столкнулись с ошибкой, и она была изначально установлена
Не мигрируйте на суперпользователь - если мигрировать там ответ невозможен, потому что стандартный инструмент не может сделать это.
На гипотетической * системе NIX, в которой нужна разрешение на запись в файл, чтобы удалить его, есть решение, связанное с FCHMOD (). Однако система, которая демонстрирует это поведение, является системой Windows.
Решение
Вы пытались включить SEBACKUPPRIVILEGE и SERESTOREPRIVILEGE, которые позволяют администраторам расслабиться многие проверки безопасности?
Вы можете найти эта группа новостей полезный.
Редактировать: Чтобы сделать это без привилегий, и без создания состояния гонки вам понадобится поддержка транзакционной NTFS, присутствующая в Vista и выше. Кстати, вы можете установить атрибуты, используя ручку, пропустите file_basic_info на Setfileinformationbyhandle., который можно совершить транзакции, см. Примечания. Или вы можете использовать FindFirStfileName, чтобы найти другую жесткую ссылку на тот же файл, который не удаляется, с помощью которого можно установить только для чтения.
Другие советы
Благодаря Бен Войгту:
#include <windows.h>
int main(int argc, char **argv)
{
while (*++argv) {
HANDLE h;
DWORD attrs;
attrs = GetFileAttributes(*argv);
SetFileAttributes(*argv, attrs & ~FILE_ATTRIBUTE_READONLY);
h = CreateFile(*argv, GENERIC_READ|GENERIC_WRITE, 7, NULL, OPEN_EXISTING,
FILE_FLAG_DELETE_ON_CLOSE, NULL);
SetFileAttributes(*argv, attrs);
if (h != INVALID_HANDLE_VALUE) {
CloseHandle(h);
}
}
}
Это невозможно. Жесткая ссылка - это просто другое имя для файла; Вы можете иметь много жестких ссылок, но есть только один базовый объект файла (данные, дескриптор безопасности, атрибуты, время файла и т. Д.). Если объект файла имеет набор атрибута только чтения, то любые жесткие ссылки по определению также будут иметь набор атрибута.