2016-07-06 6 views
-2

observablecollectionに読み込まれているJSONデータで異常な動作をします。使用状況に応じて文字列が異なるように表示されます

JSONインポートの例と、フォルダパスの表示方法を示します。

{ 
"projectNumber":"16000", 
"projectName":"Sample Project", 
"Directory":"@\"C:\\Users\"", } 

これまでのところ、私はobservablecollectionにロードした後、期待通りにデータを使用することができました。例えば、メッセージボックスはメッセージボックスに(selectedfolder)を次のように表示します。@ "C:\ Users"

これは、ツリービューに使用するパスです。奇妙なことに、それを使用していない代わりに代わりに私のJSONインポート( "@ \" C:\ Users \ "")から元のパス形式を使用し、 "パスに不正な文字"エラーがスローされます。

private void ListDirectory(TreeView treeView, string path) 
    { 
     treeView.Items.Clear(); 
     var rootDirectoryInfo = new DirectoryInfo(path); 
     treeView.Items.Add(CreateDirectoryNode(rootDirectoryInfo)); 
    } 

    private static TreeViewItem CreateDirectoryNode(DirectoryInfo directoryInfo) 
    { 
     var directoryNode = new TreeViewItem { Header = directoryInfo.Name }; 
     foreach (var directory in directoryInfo.GetDirectories()) 
      directoryNode.Items.Add(CreateDirectoryNode(directory)); 

     foreach (var file in directoryInfo.GetFiles()) 
      directoryNode.Items.Add(new TreeViewItem { Header = file.Name }); 

     return directoryNode; 

    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 

     Project selectedProject = comboBox.SelectedItem as Project; 
     selectedfolder = selectedProject.Directory.ToString(); 
     MessageBox.Show(selectedfolder); 

     if (selectedProject != null) 
     { 
      this.ListDirectory(treeView, selectedfolder); 
     } 

私がここで紛失しているのを見て、同じ文字列がどのように使用されているのかによって表示されるのはなぜですか?

答えて

3

@""文字列リテラルは、バックスラッシュを含む文字列を含むコードの作成に役立ちます。コードのこのビットは、例えば、有効なパスへの参照が含まれており、@""ビットは、通常のCスタイルの文字列とは異なるバックスラッシュを治療するために、C#コンパイラに指示します:あなたが実際に@""ビットを埋め込むたら

string example1 = @"C:\Users"; 
Debug.WriteLine(example1); // Outputs C:\Users 
// This works 
var temp1 = new DirectoryInfo(example1); 

文字列では、@"文字を含む文字列で終わりますが、これはWindowsでは有効なパスではありません。言い換えれば

string example2 = "@\"C:\\Users\""; 
Debug.WriteLine(example2); // Outputs @"C:\Users" 
// This throws an exception 
var temp2 = new DirectoryInfo(example2); 

@""を使うには、C#のコードの罰金ですが、JSONオブジェクトのために、あなたは文字をエスケープする\を使用して、このようなものであるためにあなたのJSONテキストを変更する必要がありますので、それは有効ですJSONデシリアライザが文字列の解析を終了した後のパス:

{ 
    "projectNumber":"16000", 
    "projectName":"Sample Project", 
    "Directory":"C:\\Users", 
} 
0

これは明らかに答えでした。ありがとう、Anon!何が私を捨てていたのかは、文字列がメッセージ・ボックスにパス参照でどのように使用するのかを正確に示したかどうかということでした。初心者ミス!

関連する問題