【问题标题】:.Net Core 3.1 Coravel scheduler and Directory.CreateDirectory.Net Core 3.1 Coravel 调度器和 Directory.CreateDirectory
【发布时间】:2020-03-10 14:11:23
【问题描述】:

我正在使用调度程序创建简单的服务,它将执行一些重复的 IO 操作。我正在使用 Coravel 调度库。

我的配置很简单:

 public static void Main(string[] args)
{
    var host = CreateHostBuilder(args).Build();
    host.Services.UseScheduler(scheduler => {
    scheduler.OnWorker("FirstTask");
    scheduler.Schedule<FirstService>().EveryMinute();

    scheduler.OnWorker("SecondTask");
    scheduler.Schedule<SecondService>().EveryFifteenSeconds();
  });
    host.Run();
}

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureServices((hostContext, services) =>
        {
          services.AddScheduler();
          services.AddTransient<FirstService>();
          services.AddTransient<SecondService>();
          services.AddOptions();
          services.Configure<DbOptions>(hostContext.Configuration.GetSection("DbOptions"));
        })
      .UseSerilog((hostingContext, loggerConfiguration) => loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));

简单的服务

public class FirstService : IInvocable
{
  private readonly ILogger<FirstService> _logger;
  private readonly DbService _context;

  public FirstService(ILogger<FirstService> logger, DbContext context)
  {
    _logger = logger;
    _context = context;
  }

  public async Task Invoke()
  {
    _logger.LogInformation("FirstService was invoked!");
    var data = _context.Collect();
    await StoreData(data);
  }

  public async Task StoreData(string url)
  {
    try
    {
      if (string.IsNullOrEmpty(_config.PhotoWebPrefix) || string.IsNullOrEmpty(_config.PhotoRootPath)) throw new ArgumentException("Wrong configuration");
      using var client = new WebClient();
      var path = url.Replace(_config.PhotoLinkPrefix, _config.PhotoRootPath).Replace("/", "\\");
      var result = await client.DownloadDataTaskAsync(url);
      Directory.CreateDirectory(Path.GetDirectoryName(path));
      await File.WriteAllBytesAsync(path, result);
    }
    catch (Exception e)
    {
      _logger.LogError(e, "Error in StoreData");
      throw;
    }
  }
}

一切正常,但是当我尝试创建这样的目录时(示例只是为了简单起见)。数据很好,我已经在控制台应用程序中尝试过,一切正常。

Directory.CreateDirectory(@"‪C:\Users\XXX\Desktop\testDir\Photo\2019\12\11\528\");

我收到一个错误:

文件名、目录名或卷标语法不正确。 : 'C:\Projects\PROJ_NAME\Service\C:\Users\XXX\Desktop\testDir\Photo\2019\12\11\528\

我做错了什么,我该如何解决这个问题?

【问题讨论】:

  • 您发布的代码不包含对Directory.CreateDirectory 的任何调用。您发布的字符串包含一个前导不可见字符。你在哪里打这个电话,路径从哪里来?

标签: .net-core-3.1


【解决方案1】:

问题的代码不包含对Directory.CreateDirectory 的任何调用。字符串本身以不可见的Left-To-Right Embedding character 开头,因此不能将其视为绝对路径。

这个表达式:

(int)@"‪C:\Users\XXX\Desktop\testDir\Photo\2019\12\11\528\"[0]

返回8234

无论该字符串来自何处,都需要对其进行清理。可能是从某个文档中复制的吗?

【讨论】:

  • 你说得对,我的问题是配置,更具体地说,这个_config.PhotoRootPath 包含一个隐形字符,这让我的日子过得很糟糕。谢谢!
猜你喜欢
  • 2015-09-09
  • 2020-04-10
  • 2020-08-18
  • 2022-06-30
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多