2015-09-16 216 views
-2

我想補充的項目有名稱和路徑列表框,我得到這個eror:不能類型「string」隱式轉換爲「字符串[]」

無法隱式轉換類型stringstring[]

string path = textbox1.Text; 
string[] FileName, FilePath; 

DirectoryInfo directoryInfo = new DirectoryInfo(path); 
FileInfo[] files = directoryInfo.GetFiles(); 

foreach(FileInfo fileInfo in files) 
{ 
    FileName = fileInfo.FullName; // Here 
    FilePath = fileInfo.Name; // and here 
    listbox2.Items.Add(fileInfo.FullName); 
} 
+0

時,你爲什麼宣佈'FileName'和'FilePath'變量字符串數組,而要通過枚舉和FileNamesFilePaths不只是字符串變量?您如何期望能夠將單個字符串值分配給數組變量? –

+0

你想用文件做什麼?就目前而言,你根本不使用'FileName'或'FilePath'。 –

+1

你試圖達到的目標並不十分清楚。你想在你的代碼中使用一組文件名和路徑嗎?因爲目前你沒有在你提供的樣本中使用它們。此外,您的代碼已經完全按照您所說的嘗試執行:將項目添加到列表框中。然後你不用'FileName'或'FilePath'做任何事情。所以,這不僅僅是一個問題,而且它看起來像你想做的一切。有什麼問題? – sab669

回答

0

您已經定義FileNameFilePathstring[]。看起來像你希望他們每個都包含單個字符串值。

string[] FileName, FilePath; 

他們改變string

string FileName, FilePath; 
+0

他想要一個單一的字符串似乎不太可能,因爲他在循環集合時將這些變量賦值爲一個值。因此,對於一個「常規」字符串,這些變量將只包含他的集合中最後一個'FileInfo'對象的值。如果他想要將每個文件的名稱和路徑存儲在數組中。但是爲什麼他將包含路徑,分配給'FileName'和'FileInfo.Path'的'FileInfo.FullName'分配給'FilePath'的原因是任何人猜測的。 – sab669

4

您已經聲明此:

string[] FileName, FilePath; 

所以這個分配:

FileName = fileInfo.FullName; // Here 
FilePath = fileInfo.Name; // and here 

將字符串(例如,fileInfo.FullName是字符串)分配給字符串數組。

什麼你想要做的就是這些列表,以便定義列表和添加值:

string path = textbox1.Text; 
var FileNames = new List<string>(); 
var FilePaths = new List<string>(); 

DirectoryInfo directoryInfo = new DirectoryInfo(path); 
FileInfo[] files = directoryInfo.GetFiles(); 

foreach(FileInfo fileInfo in files) { 
    FileNames.Add(fileInfo.FullName); // Here 
    FilePaths.Add(fileInfo.Name); // and here 
    listbox2.Items.Add(fileInfo.FullName); 
} 
+0

好罷工:)) –

0

的問題是,FileNameFilePath被聲明爲string[],但你嘗試給他們分配一個string。但是,既然你說你試圖添加一個名稱和路徑的文件列表到一個列表框,你根本不需要變量FileNameFilePath。什麼會更容易是設置ListBoxDataSource並設置爲顯示該對象的屬性:

listbox2.DisplayMember = "Name"; //The Name property from FileInfo 
listbox2.DataSource = files; 

然後,當它的時間來獲得所選擇的項目,將它轉換爲FileInfo的:

var selectedFileInfo = (FileInfo)listbox2.SelectedItem; 
var selectedFileName = selectedFileInfo.Name; 
//etc 
0

簡單地聲明FileNamesFilePaths在單個foreach循環中鍵入List<string>並執行Add可能會更好,但這裏是linq的替代方法。


string[] FileNames, FilePaths; 

使用匿名函數委託,兩個LINQ操作。

FileNames = files.Select(f => f.FullName).ToArray(); 
FilePaths = files.Select(f => f.Name).ToArray(); 
listBox2.AddRange(files.Select(FileNames)); //AddRange can take either IEnumerable<T> or T[] as a parameter 

如果你建立的手前的公式,它變得更加一點點清晰(也許更優化),對你不聲明匿名委託功能。

// these can be declared out of function scope as readonly.. 
Func<FileInfo, string> SelectFullName = (f) => f.FullName; 
Func<FileInfo, string> SelectName = (f) => f.Name; 

FileNames = files.Select(SelectFullName).ToArray(); 
FilePaths = files.Select(SelectName).ToArray(); 
listBox2.AddRange(FileNames); 

的優勢,以LINQ方法是,你不會增加項目

相關問題