【问题标题】:Replacing delimiter characters in file path替换文件路径中的分隔符
【发布时间】:2010-04-14 21:52:30
【问题描述】:

我正在 VS 2008 中开发 C# Web 应用程序。我让用户选择一个输入文件,然后将文件路径存储在一个字符串变量中。但是,它将此路径存储为"C:\\folder\\..."。所以我的问题是如何将此文件路径转换为单个“\”?

感谢大家的帮助!请原谅我,因为我是 ASP.NET 开发的新手。这是我在上下文中的更多代码。首先我想看看目录是否存在。如果我检查文件是否存在,我想我不必检查这个。但这应该仍然有效吗?目前我的“路径”字符串变量没有按我需要的方式显示。我不确定如何制定这个声明。最终我想执行 ReadAllText 语句(见最后一行)。

protected void btnAppend_Click(object sender, EventArgs e)
{
    string fullpath = Page.Request.PhysicalPath;
    string fullPath2 = fullpath.Replace(@"\\", @"\");

    if (!Directory.Exists(fullpath2))
    {
    string msg = "<h1>The upload path doesn't exist: {0}</h1>";
    Response.Write(String.Format(msg, fullpath2));
    Response.End();
}
    string path = "@" + fullpath2 + uploadFile.PostedFile.FileName; 

    if (File.Exists(path))
    {
        // Create a file to write to.
        try
        {
            StreamReader sr = new StreamReader(path);
            string s = "";
            while(sr.Peek() > 0)
                s = sr.ReadLine();
            sr.Close();
        }
        catch (IOException exc)
        {
            Console.WriteLine(exc.Message + "Cannot open file.");
            return; 
        }
    }

    if (uploadFile.PostedFile.ContentLength > 0)
    {

        inputfile = System.IO.File.ReadAllText(path);

【问题讨论】:

  • 从安全角度来看,这看起来非常危险。您是否允许用户决定他们在服务器上上传的位置和/或文件名???
  • 好点,高科技,但我的网络应用程序的目的是让用户能够将所选输入文件中的列与所选 Adventureworks 数据库中的列进行映射,并将这些输入记录附加到选定的表。有没有更安全的方法来做到这一点?

标签: c# visual-studio-2008 replace delimiter


【解决方案1】:

您确定问题出在反斜杠上吗?反斜杠是字符串中的转义字符,因此如果要将其添加到字符串中,则必须将其键入为“\\”而不是“\”。 (如果你不使用@)请注意,调试器经常以你在代码中的方式显示字符串,使用转义字符,而不是直接显示。

根据documentation,Page.Request.PhysicalPath 返回您所在的特定文件的路径,而不是目录。 Directory.Exists 仅当您给它一个目录而不是文件时才为真。 File.Exists() 是否返回 true?

【讨论】:

    【解决方案2】:

    首先,调用fullpath.Replace()fullpath 没有任何作用;它返回一个新字符串。此外,当您的字符串文字中包含 \(反斜杠)时,您需要告诉编译器您 没有 尝试使用转义序列:

    fullpath = fullpath.Replace(@"\\", @"\"); 
    

    @ 的意思是“请按字面意思(逐字)对待这个字符串”。换句话说,“当我说反斜杠时,我是指反斜杠!”

    http://msdn.microsoft.com/en-us/library/362314fe.aspx

    编辑:

    正如 LeBleu 提到的,您在完整的文件路径上调用 Directory.Exists()。这行不通;您需要从路径中提取目录部分。试试这个:

    if (!Directory.Exists(Path.GetDirectoryName(fullpath)))
    {
         ...
    }
    

    【讨论】:

    • 感谢 Charles,但是当我在 Watch 窗口中尝试此操作时,它仍然显示双“\”。换句话说,它不会取代任何东西。
    • 将您现在使用的代码放入您的问题中。我的示例中的代码肯定会将双反斜杠转换为单反斜杠。
    • Charles,我不确定我是否理解您的解释。但是,我更新了我的问题,所以也许你会看到我最终想要实现的目标。
    • 感谢您的帮助,查尔斯。我解决了我的问题! (见下文)。
    • 我不知道你是如何修复它的,因为你发布的最新代码更糟糕!我猜你意识到你不需要将“@”附加到非文字字符串。仅在字符串文字上使用 @ 技巧。
    【解决方案3】:

    您可能需要考虑将其替换为 Path.DirectorySeparatorChar 而不是 \ 以防您的代码有一天可能最终在不同的平台上运行(mono.net 允许它在 linux 上运行,或者更有可能可能最终会出现在一些奇怪的移动平台上)

    【讨论】:

    • 但是这样他就没有理由担心斜线了,不是吗?
    • 感谢大家的帮助!我解决了我的问题。我所做的只是删除了“@”字符,以便我的文件路径将“\\”视为“\”!简单吧?
    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 2014-01-16
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    相关资源
    最近更新 更多