如何生成唯一的文件名?

时间:2018-04-24 18:00:38

标签: c esp8266 nodemcu

以下是将用户输入写入 enduser_custom_parameters.json 文件的代码。这是esp8266 / nodeMCU的enduser_setup module的一部分。

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;
}

我应该如何修改此代码以将数据每次保存到单独的文件中? (我正在修改模块以充当强制门户以从不同用户收集数据) 我想我可以使用GUID,当前日期/时间或用户的MAC(理想选项)作为文件名。但不知道怎么用C做。

3 个答案:

答案 0 :(得分:1)

首先,获取mac地址。 station_info 结构包含客户端的MAC地址,但您需要将其传递给此功能才能使用它,在这里我使用AP的mac进行演示:

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");

答案 1 :(得分:0)

有GUID / UUID的库(例如libuuid)。这些相互作用的风险很小。如果要在本地保存所有数据,可以通过使用特定于操作系统的创建文件的方法进一步确保不会发生冲突,例如在POSIX系统上,您可以使用

f = open('file.txt', 'r')
content = f.read()
allLines = content.split('\n')
output = []
for singleLine in allLines:
    singleLine = singleLine.split('|')
    extractedJSON = {}
    extractedJSON[singleLine[0]] = singleLine[1]
    output.append(extractedJSON)
print "output"
print output
f.close()

只有在确实创建新文件时才会成功。成功时,使用int fd = open(filename, O_CREAT|O_EXCL, S_IRWXU); 从描述符中获取标准C FILE *。出错时,只需创建一个新的UUID,将其合并到文件名中,然后重试。

答案 2 :(得分:-1)

prepend或将unix时间戳附加到文件名