json_db_utils.rs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use tokio::fs::File;
  2. use tokio::io::AsyncWriteExt;
  3. use tokio::{fs, spawn};
  4. use tracing::{error};
  5. pub fn write_to_file(json_data: String, file_path: String) {
  6. spawn(async move {
  7. // 尝试创建文件路径
  8. if let Err(e) = fs::create_dir_all(
  9. // 获取文件目录路径
  10. std::path::Path::new(&file_path)
  11. .parent() // 获取父目录(即文件路径除去文件名后的部分)
  12. .unwrap_or_else(|| std::path::Path::new("")), // 如果没有父目录,使用当前目录
  13. )
  14. .await
  15. {
  16. // 如果创建路径失败,打印错误日志
  17. error!("创建目录错误: {:?}", e);
  18. return; // 结束任务
  19. }
  20. // 异步地执行文件写入操作
  21. if let Err(e) = async {
  22. let mut file = File::create(&file_path).await?;
  23. file.write_all(json_data.as_bytes()).await?;
  24. Result::<(), std::io::Error>::Ok(())
  25. }
  26. .await
  27. {
  28. // 如果发生错误,只打印错误日志
  29. error!("json db写入错误: {:?}", e);
  30. }
  31. });
  32. }
  33. pub fn generate_file_path(exchange: &str, symbol: &str, subscriber_type: &str, serial: i64) -> String {
  34. return format!("db/{}/{}/{}/{}.json", exchange, symbol, subscriber_type, serial)
  35. }
  36. #[tokio::test]
  37. async fn write_test() {
  38. use std::time::Duration;
  39. use tokio::time::sleep;
  40. // 调用函数,不需要等待它完成
  41. write_to_file("{\"key\": \"value\"}".to_string(), "db/test.json".to_string());
  42. sleep(Duration::from_secs(2)).await;
  43. }