如何创建本地文件的Tuple<IEnumerable>?C#类型转换问题求助
问题:获取本地文件列表的C#方法报错解决
我并非C#母语开发者,接手了一个需要修改的程序。现有一段可获取SFTP待下载文件列表的代码,返回类型为Tuple<IEnumerable<SftpFile>, string>:
public Tuple<IEnumerable<SftpFile>, string> GetRemoteFiles(string strHost, string strUserName, string strPWord, string strSFTPDirectory) { using (SftpClient sftp = new SftpClient(strHost, strUserName, strPWord)) { string result = ""; try { sftp.Connect(); var files = sftp.ListDirectory(strSFTPDirectory); sftp.Disconnect(); return Tuple.Create(files, result); } catch (Exception e) { if (sftp.IsConnected) { sftp.Disconnect(); } IEnumerable<SftpFile> files = null; result = "Error: " + e.ToString(); return Tuple.Create(files, result); } } }
现在想要编写类似方法获取本地目录待上传文件列表,但尝试两种写法均报错:
第一种写法及报错
public Tuple<IEnumerable<Array>, string> GetLocalFiles(string strPDbOutboxFilePath) { { string result = ""; try { var files = Directory.GetFiles(strPDbOutboxFilePath, "*", SearchOption.AllDirectories); return Tuple.Create(files, result); } catch (Exception e) { IEnumerable<string> files = null; result = "Error: " + e.ToString(); return Tuple.Create(files, result); } } }
报错信息:
CS0029: Cannot implicitly convert type 'System.Tuple<System.Collections.Generic.IEnumerable<string>, string>' to 'System.Tuple<System.Collections.Generic.IEnumerable<Array>, string>'
第二种写法及报错
public Tuple<IEnumerable<FileInfo>, string> GetLocalFiles(string strPDbOutboxFilePath) { { string result = ""; try { var files = Directory.GetFiles(strPDbOutboxFilePath, "*", SearchOption.AllDirectories); return Tuple.Create(files, result); } catch (Exception e) { IEnumerable<string> files = null; result = "Error: " + e.ToString(); return Tuple.Create(files, result); } } }
报错信息:
CS0029: Cannot implicitly convert type 'System.Tuple<System.Collections.Generic.IEnumerable<string>, string>' to 'System.Tuple<System.Collections.Generic.IEnumerable<System.IO.FileInfo>, string>'
解决方案
报错原因分析
两种写法的核心问题都是返回类型与实际返回的集合类型不匹配:
- 第一种写法:
Directory.GetFiles返回string[](即IEnumerable<string>),但方法声明返回IEnumerable<Array>,类型无法隐式转换; - 第二种写法:同样用
Directory.GetFiles返回字符串数组,但方法声明要返回IEnumerable<FileInfo>,类型不兼容。
方案1:返回文件路径字符串集合
修改方法返回类型为Tuple<IEnumerable<string>, string>,与Directory.GetFiles的返回类型匹配:
public Tuple<IEnumerable<string>, string> GetLocalFiles(string strPDbOutboxFilePath) { string result = ""; try { var files = Directory.GetFiles(strPDbOutboxFilePath, "*", SearchOption.AllDirectories); return Tuple.Create(files, result); } catch (Exception e) { IEnumerable<string> files = null; result = "Error: " + e.ToString(); return Tuple.Create(files, result); } }
方案2:返回FileInfo对象集合
如果需要文件的详细属性(如大小、修改时间),改用DirectoryInfo.GetFiles获取FileInfo集合,匹配方法声明的返回类型:
public Tuple<IEnumerable<FileInfo>, string> GetLocalFiles(string strPDbOutboxFilePath) { string result = ""; try { var dirInfo = new DirectoryInfo(strPDbOutboxFilePath); var files = dirInfo.GetFiles("*", SearchOption.AllDirectories); return Tuple.Create(files, result); } catch (Exception e) { IEnumerable<FileInfo> files = null; result = "Error: " + e.ToString(); return Tuple.Create(files, result); } }
选择建议
- 若仅需文件路径,选方案1,代码更简洁轻量;
- 若需操作文件属性或进行文件相关操作,选方案2,
FileInfo提供了丰富的文件操作API。
内容的提问来源于stack exchange,提问作者Bullitt_McQueen
相关产品推荐
相关产品推荐

