4

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);
4

3 に答える 3

6

問題はバックスラッシュだと思いますか? バックスラッシュは文字列のエスケープ文字です。文字列にバックスラッシュを追加する場合は、「\」ではなく「\\」と入力する必要があります。(@ を使用しない場合) デバッガーは、直接ではなく、エスケープ文字を使用して、コードに記述した方法で文字列を表示することが多いことに注意してください。

documentationによると、 Page.Request.PhysicalPath は、ディレクトリではなく、現在の特定のファイルへのパスを返します。Directory.Exists は、ファイルではなくディレクトリを指定した場合にのみ true になります。File.Exists() は true を返しますか?

于 2010-04-14T22:07:50.967 に答える
5

まず、呼び出しfullpath.Replace()は何もしませんfullpath。新しい文字列を返します。また、文字列リテラルに \ (バックスラッシュ) が含まれている場合は、エスケープ シーケンスを使用しようとしていないことをコンパイラに伝える必要があります。

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

@「この文字列を文字通り(逐語的に)扱ってください」という意味です。言い換えれば、「バックスラッシュと言うときは、バックスラッシュを意味します!」

http://msdn.microsoft.com/en-us/library/362314fe.aspxを参照してください。

編集:

LeBleu が述べたように、完全なファイルパスで Directory.Exists() を呼び出しています。これはうまくいきません。パスからディレクトリ部分を抽出する必要があります。これを試して:

if (!Directory.Exists(Path.GetDirectoryName(fullpath)))
{
     ...
}
于 2010-04-14T21:58:19.630 に答える
0

\ ではなく Path.DirectorySeparatorChar に置き換えることを検討することをお勧めします。これは、コードがいつか別のプラットフォームで実行される可能性があるためです (mono.net では、Linux での実行が許可されているか、最終的に終了する可能性が高くなります)。いくつかの奇妙なモバイル プラットフォームで)

于 2010-04-14T22:02:09.390 に答える