Вопрос

У меня есть набор файлов с несколькими ссылками на них.

Файлы принадлежат источнику 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);
        }
    }
}

Это невозможно. Жесткая ссылка - это просто другое имя для файла; Вы можете иметь много жестких ссылок, но есть только один базовый объект файла (данные, дескриптор безопасности, атрибуты, время файла и т. Д.). Если объект файла имеет набор атрибута только чтения, то любые жесткие ссылки по определению также будут иметь набор атрибута.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top