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

Чтобы ответить на ваш вопрос, я никогда не слышал о технологиях, позволяющих читать LDF напрямую, но на рынке есть несколько продуктов, которые могут «клонировать» базу данных почти мгновенно, используя некоторые внутренние приемы. Имейте в виду, что данные не копируются с помощью этих инструментов, но они обеспечивают мгновенный доступ к таким случаям использования, как ваш.

Может быть несколько бесплатных способов сделать это, особенно с помощью облачных функций или функций связанных клонов, которые предлагают виртуальные машины, но в настоящее время я знаю только о платных продуктах, таких как Dell EMC, Redgate и Windocks.

Легче всего попробовать, не находясь в облаке: Red Clone SQL Clone с 14-дневной бесплатной пробной версией:

  1. Red Gate SQL Clone Link
  2. [ 112] Windocks.com (это бесплатно в некоторых случаях, но труднее начать)

5
задан qwzybug 21 April 2009 в 01:38
поделиться

3 ответа

Какой-то старый код Fortran, который я видел:

     integer *4 one,two,three;

c    asssign one to 100 before entering the loop
     one=100;
- 121 --- 521532--

Используйте системный вызов open с Опции O_EXCL и O_CREAT . Если файл еще не существует, open создаст его, откроет и вернет вам дескриптор файла; если он существует, open завершится неудачно и для errno будет EEXIST .

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

1
ответ дан 15 December 2019 в 06:35
поделиться
int fd;
uint32_t counter;
char filename[1024]; // obviously unsafe

sprintf(filename, "foo.txt");
if( (fd = open(filename, O_CREAT | O_EXCL | O_EXLOCK, 0644)) == -1 && errno == EEXIST ) 
{
    for( counter = 1; counter < UINT32_MAX; counter++ ) {
      sprintf(filename, "foo-%u.txt", counter);
      if( (fd = open(filename, O_CREAT | O_EXCL | O_EXLOCK, 0644)) == -1 && errno == EEXIST )
        continue;
      else
        break;
    }
}

if( fd == -1 && counter == UINT32_MAX ) {
    fprintf(stderr, "too many foo-files\n");
} else if( fd == -1 ) {
    fprintf(stderr, "could not open file: %s\n", strerror(errno));
}

// otherwise fd is an open file with an atomically unique name and an
// exclusive lock.
1
ответ дан 15 December 2019 в 06:35
поделиться

Как насчет:

  1. Записать файл во временный каталог, где вы знаете, что нет риска столкновения
  2. Используйте NSFileManager, чтобы переместить файл в предпочтительное место назначения
  3. Если шаг 3 завершится неудачно из-за того, что файл уже существует, добавьте / увеличьте числовой суффикс и повторите шаг 2

По сути, вы заново создадите обработку записи атомарного файла в Cocoa. , но добавив в функцию обеспечения уникального имени файла. Большим преимуществом этого подхода является то, что в случае отключения питания или сбоя приложения во время записи неполный файл будет спрятан в папке tmp и удален системой; не оставлено пользователю, чтобы попытаться работать с ним.

1
ответ дан 15 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: