2

我正在尝试学习如何在 xml 文件中保存日期,并且当我在代码本身中提供路径(例如 C:\Users\Name\Documents)时已经可以做到这一点。但是我希望用户在第一次打开程序时选择一次文件路径,然后永远使用这个文件路径。

到目前为止,我已经那么远了:

string xmlFilePath = "C:\\Users\\Name\\Documents\\Visual Studio 2012\\Projects\\ToDoList\\xmlList.xml";
XmlTextWriter xWriteList = new XmlTextWriter(xmlFilePath, Encoding.UTF8);

然后我有一大堆编写命令,它们都运行良好。只是为了澄清我的问题:当它在我的示例代码中显示“C:\Users 等时,我想要用户选择一次的文件路径。我知道我可以让用户使用 FileDialog 选择文件路径,但我没有'不知道如何以某种方式保存此路径。显然我不能再次将其保存在 xml 中,因为用户将不得不再次选择该路径。

我希望你能理解我的问题,并感谢所有提前回答的人。

4

3 回答 3

1

您需要从SaveFileDialog.FileName属性中获取文件并将其保存在类变量中。

这将在程序运行时持续存在。

要在会话之间保持这种状态,您需要将其保存在用户硬盘上的某个位置。您可以通过使用应用程序配置或设置文件来做到这一点。

在此设置一个字符串属性,然后将所选文件名保存到该属性。

加载时:

globalFileName = Properties.Settings.Default.FileName;

关闭应用程序时:

Properties.Settings.Default.FileName = globalFileName;
Properties.Settings.Default.Save();
于 2013-02-10T15:14:41.603 回答
0

听起来您需要ApplicationSettingsBase派生设置。

    //Application settings wrapper class 
    sealed class FormSettings : ApplicationSettingsBase
    {
        [UserScopedSettingAttribute()]
        public string FilePath
        {
            get { return (string )(this["FilePath"]); }
            set { this["FilePath"] = value; }
        }
    }

像这样使用:

<on form load handler>
frmSettings1 = new FormSettings();
if(frmSettings1.FilePath==null)
{
    frmSettings1.FilePath = PromptForLocation();
}

<form exit handler>
frmSettings1.Save();

哪里PromptForLocation好。提示位置,像你一样使用“可以让用户选择一个文件路径FileSaveDialog

应该注意的是,这将提供一个“每个用户”设置,该设置存储在用户配置文件目录中。如果其他用户登录,他们将获得此设置的自己的副本。

于 2013-02-10T15:14:51.343 回答
0

您需要的是一个设置文件,它可以是一个 XML 文件。程序专用的设置文件。它总是在同一个地方,所以你的程序知道它在哪里。它也可以是用户特定的。

我创建了一个类库来包含在我所有的公司项目中,它有一个类文件,公司名称,所以它显然是关于公司在 Program Files 目录中的位置,以及在 Common 目录中存储设置和 User 的目录来存储设置。

因此,我将展示这三个,但您想要的将是用户的设置目录或 Common。使用程序目录的问题在于它可能在C:\Program Files其中,除非您的程序以管理员身份运行,否则操作系统不会让您在那里写入。

公共目录和文件:

public const string Company = "YourCompanyName";

/// <summary>
/// Common to all users Company data directory.
/// </summary>
public static DirectoryInfo CommonDataDirectory
{
    get
    {
        string env = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData);
        string path = Path.Combine(env, Company);
        return new DirectoryInfo(path);
    }
}

/// <summary>
/// Common to all users data file.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static FileInfo CommonDataFile(params string[] path)
{
    string fullName = Paths.Combine(CommonDataDirectory.FullName, path);
    return new FileInfo(fullName);
}

用户的设置目录:

/// <summary>
/// User's common data directory
/// </summary>
/// <returns></returns>
public static DirectoryInfo UserDataDirectory
{
    get
    {
        string env = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
        string path = Path.Combine(env, Company);
        return new DirectoryInfo(path);
    }
}

/// <summary>
/// File in user's common data directory
/// </summary>
/// <param name="filename"></param>
/// <returns></returns>
public static FileInfo UserDataFile(params string[] path)
{
    return new FileInfo(Paths.Combine(UserDataDirectory.FullName, path));
}

程序目录:(程序/可执行文件的运行位置)

public static DirectoryInfo ProgramDirectory
{
    get
    {
        string executablePath = System.Windows.Forms.Application.StartupPath;
        return new DirectoryInfo(executablePath);
    }
}

/// <summary>
/// Get's the file in the exectuable's directory, which would be
/// ProgramFiles/applicationName/filename
/// </summary>
public static FileInfo ProgramFile(params string[] path)
{
    string file = Paths.Combine(ProgramDirectory.FullName, path);
    return new FileInfo(file);
}

这是上面代码中引用的Paths 类。

另一件事是,您将希望从这些为您的特定程序创建一个子目录。这样您的不同程序可以具有相同名称的文件like Settings.xml并且不会相互冲突。

我有一个 ApplicationBase 类,它将 Company 类用于特定于应用程序的位置。例子:

/// <summary>
/// The application's name
/// </summary>
public static string ApplicationName
{
    get { return System.Windows.Forms.Application.ProductName; }
}

/// <summary>
/// Common to all users, application's data directory.
/// </summary>
public static DirectoryInfo CommonDataDirectory
{
    get
    {
        string fullName = Path.Combine(Company.CommonDataDirectory.FullName, ApplicationName);
        return new DirectoryInfo(fullName);
    }
}

/// <summary>
/// Common to all users, file in application's data directory.
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public static FileInfo CommonDataFile(params string[] name)
{
    string fullName = Paths.Combine(CommonDataDirectory.FullName, name);
    return new FileInfo(fullName);
}

我让你来创建另外两个,用户和程序的目录属性和文件方法。

于 2013-02-10T19:02:38.410 回答