Как генерировать уникальные имена файлов? - PullRequest
0 голосов
/ 24 апреля 2018

Вот код, который записывает пользовательский ввод в файл enduser_custom_parameters.json .Это часть enduser_setup module из esp8266 / nodeMCU.

static int enduser_setup_write_file_with_extra_configuration_data(
char * configuration_string, int configuration_length
)
{
  int p_file = 0;
  lua_State *L = NULL;

  ENDUSER_SETUP_DEBUG("enduser: opening enduser_custom_parameters.json for write");

  // setup the file output
  p_file = vfs_open("enduser_custom_parameters.json", "w");
  if (p_file == 0)
  {
    ENDUSER_SETUP_DEBUG("Can't write to file!");
    return 1;
  }

  /* Not certain what this does */
  L = lua_getstate();

  if (L != NULL) 
  {
    lua_pushlstring(L, configuration_string, configuration_length);
  }

  vfs_write(p_file, configuration_string, configuration_length);
  vfs_close(p_file);
  return 0;
}

Как мне изменить этот код, чтобы каждый раз сохранять данные в отдельный файл?(Я модифицирую модуль для работы в качестве Captive Portal для сбора данных от разных пользователей) Я думаю, что я могу использовать GUID, текущую дату / время или MAC пользователя (идеальный вариант) в качестве имени файла.Но понятия не имею, как это сделать с C.

Ответы [ 3 ]

0 голосов
/ 24 апреля 2018

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

uint8_t mac[6];
wifi_get_macaddr(SOFTAP_IF, mac);

и теперь создайте имя файла, которое содержит этот адрес:

char filename[64];
sprintf(filename, "enduser_custom_parameters_%02x%02x%02x%02x%02x%02x.json", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);

и затем откройте файл:

p_file = vfs_open(filename, "w");
0 голосов
/ 24 апреля 2018

Существуют библиотеки для идентификаторов GUID / UUID (например, libuuid ). Риск столкновения с ними чрезвычайно низок. Если вы хотите сохранить все данные локально, вы можете дополнительно гарантировать, что не произойдет коллизии, используя специфические для ОС методы создания файла, например, в системе POSIX, вы можете использовать

int fd = open(filename, O_CREAT|O_EXCL, S_IRWXU);

, который будет успешным, только если он действительно создаст новый файл. В случае успеха получите стандартный C FILE * из дескриптора с fdopen(). В случае ошибки просто создайте новый UUID, включите его в имя файла и повторите попытку.

0 голосов
/ 24 апреля 2018

добавить или добавить метку времени Unix к имени файла

...