private async void RootPage_Loaded(object sender, RoutedEventArgs e)
        {
            var    recorder   = RootScope.Resolve <IRecorder>();
            var    first_time = true;
            var    error      = string.Empty;
            string path;

            while (true)
            {
                try
                {
                    CommandLineOption commandLineOption = null;
                    if (first_time)
                    {
                        // while 循环第一次运行时检查命令行参数
                        try
                        {
                            first_time = false;
                            Parser.Default
                            .ParseArguments <CommandLineOption>(Environment.GetCommandLineArgs())
                            .WithParsed(x => commandLineOption = x);

                            if (!string.IsNullOrWhiteSpace(commandLineOption?.WorkDirectory))
                            {
                                // 如果有参数直接跳到检查路径
                                path = Path.GetFullPath(commandLineOption.WorkDirectory);
                            }
                            else
                            {
                                // 无命令行参数
                                continue;
                            }
                        }
                        catch (Exception)
                        {
                            // 出错直接重新来,不显示 error
                            continue;
                        }
                    }
                    else
                    {
                        // 尝试读取上次选择的路径
                        var lastdir = string.Empty;
                        try
                        {
                            if (File.Exists(lastdir_path))
                            {
                                lastdir = File.ReadAllText(lastdir_path).Replace("\r", "").Replace("\n", "").Trim();
                            }
                        }
                        catch (Exception) { }

                        // 显示路径选择界面
                        var dialog = new WorkDirectorySelectorDialog
                        {
                            Error = error,
                            Path  = lastdir
                        };

                        if (await dialog.ShowAsync() != ContentDialogResult.Primary)
                        {
                            (Application.Current.MainWindow as NewMainWindow).CloseWithoutConfirmAction();
                            return;
                        }

                        try
                        { path = Path.GetFullPath(dialog.Path); }
                        catch (Exception)
                        {
                            error = "不支持该路径";
                            continue;
                        }
                    }

                    var config = Path.Combine(path, "config.json");

                    if (!Directory.Exists(path))
                    {
                        error = "目录不存在";
                        continue;
                    }
                    else if (!Directory.EnumerateFiles(path).Any())
                    {
                        // 可用的空文件夹
                    }
                    else if (!File.Exists(config))
                    {
                        error = "目录已有其他文件";
                        continue;
                    }

                    // 已经选定工作目录

                    // 如果不是从命令行参数传入的路径,写入 lastdir_path 记录
                    try
                    { if (string.IsNullOrWhiteSpace(commandLineOption?.WorkDirectory))
                      {
                          File.WriteAllText(lastdir_path, path);
                      }
                    }
                    catch (Exception) { }

                    // 检查已经在同目录运行的其他进程
                    if (SingleInstance.CheckMutex(path))
                    {
                        // 无已经在同目录运行的进程
                        if (recorder.Initialize(path))
                        {
                            Model.Recorder = recorder;

                            _ = Task.Run(async() =>
                            {
                                await Task.Delay(100);
                                _ = Dispatcher.BeginInvoke(DispatcherPriority.Normal, method: new Action(() =>
                                {
                                    RoomListPageNavigationViewItem.IsSelected = true;
                                }));
                            });
                            break;
                        }
                        else
                        {
                            error = "配置文件加载失败";
                            continue;
                        }
                    }
                    else
                    {
                        // 有已经在其他目录运行的进程,已经通知该进程,本进程退出
                        (Application.Current.MainWindow as NewMainWindow).CloseWithoutConfirmAction();
                        return;
                    }
                }
                catch (Exception ex)
                {
                    error = "发生了未知错误";
                    logger.Warn(ex, "选择工作目录时发生了未知错误");
                    continue;
                }
            }
        }
Exemple #2
0
        private async void RootPage_Loaded(object sender, RoutedEventArgs e)
        {
            bool first_time = true;

            var    recorder = RootScope.Resolve <IRecorder>();
            var    error    = string.Empty;
            string path;

            while (true)
            {
                CommandLineOption commandLineOption = null;
                if (first_time)
                {
                    first_time = false;
                    Parser.Default
                    .ParseArguments <CommandLineOption>(Environment.GetCommandLineArgs())
                    .WithParsed(x => commandLineOption = x);

                    if (!string.IsNullOrWhiteSpace(commandLineOption?.WorkDirectory))
                    {
                        path = Path.GetFullPath(commandLineOption.WorkDirectory);
                        goto check_path;
                    }
                }

                string lastdir = string.Empty;
                try
                {
                    if (File.Exists(lastdir_path))
                    {
                        lastdir = File.ReadAllText(lastdir_path).Replace("\r", "").Replace("\n", "").Trim();
                    }
                }
                catch (Exception) { }
                var w = new WorkDirectorySelectorDialog
                {
                    Error = error,
                    Path  = lastdir
                };
                var result = await w.ShowAsync();

                if (result != ContentDialogResult.Primary)
                {
                    (Application.Current.MainWindow as NewMainWindow).CloseWithoutConfirmAction();
                    return;
                }

                path = Path.GetFullPath(w.Path);
check_path:
                var config = Path.Combine(path, "config.json");

                if (!Directory.Exists(path))
                {
                    error = "目录不存在";
                    continue;
                }
                else if (!Directory.EnumerateFiles(path).Any())
                {
                    // 可用的空文件夹
                }
                else if (!File.Exists(config))
                {
                    error = "目录已有其他文件";
                    continue;
                }

                try
                {
                    if (string.IsNullOrWhiteSpace(commandLineOption?.WorkDirectory))
                    {
                        File.WriteAllText(lastdir_path, path);
                    }
                }
                catch (Exception) { }

                // 检查已经在同目录运行的其他进程
                if (SingleInstance.CheckMutex(path))
                {
                    if (recorder.Initialize(path))
                    {
                        Model.Recorder = recorder;
                        RoomListPageNavigationViewItem.IsSelected = true;
                        break;
                    }
                    else
                    {
                        error = "配置文件加载失败";
                        continue;
                    }
                }
                else
                {
                    (Application.Current.MainWindow as NewMainWindow).CloseWithoutConfirmAction();
                    return;
                }
            }
        }