我想知道 Portable Class Library 在功能上是否比 Compact Framework 更受限制。
我正在尝试将 CF/Windows CE 应用程序(在手持设备上运行)移植到 Xamarin 解决方案,该解决方案将针对 Android、iOS、Windows Phone 以及可能的其他东西。
不过,我遇到的问题之一是这个遗留代码(在 CF 下工作):
public static List<string> GetXMLFiles(string fileType, string startingDir)
{
const string EXTENSION = ".XML";
string dirName = startingDir;
// call it like so: GetXMLFiles("ABC", "\\"); <= I think the double-whack is what I need for Windows CE device...am I right?
var fileNames = new List<String>();
try
{
foreach (string f in Directory.GetFiles(dirName))
{
string extension = Path.GetExtension(f);
if (extension != null)
{
string ext = extension.ToUpper();
string fileNameOnly = Path.GetFileNameWithoutExtension(f);
if (fileNameOnly != null &&
((ext.Equals(EXTENSION, StringComparison.OrdinalIgnoreCase)) &&
(fileNameOnly.Contains(fileType))))
{
fileNames.Add(f);
}
}
}
foreach (string d in Directory.GetDirectories(dirName))
{
fileNames.AddRange(GetXMLFiles(fileType, d));
// from Brad Rem's answer here: http://stackoverflow.com/questions/22186198/why-is-this-function-returning-nothing-although-there-is-a-match/22186351?noredirect=1#22186351
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
return fileNames;
}
...不会在 Xamarin/CPL 解决方案中编译。我得到,“名称'目录'在当前上下文中不存在”并且右键单击该单词不会提供“解决”选项。
有没有办法让 PCL 识别“目录”或者我必须完全重写代码?如果是后者,是否有人对代替它做什么/使用有什么建议?
相关地,是否有一个 URL 可以向我显示 PCL 中[不] 可用的内容和/或显示提供的代码块中有多少是“PCL-ready”的?
更新
这篇文章中的第一张图片很有启发性。稍后,它专门讨论了“目录”在 PCL 场景中不可用。
更新 2
我下载了下面 Daniel Plaisted 引用的 PCLStorage 包,以允许我访问 PCL 项目中的文件系统。
使用下载页面 [http://pclstorage.codeplex.com/] 开头的示例代码作为起点,我已经做到了这一点:
public async Task<List<string>> GetXMLFiles(string fileType, string startingDir)
{
const string EXTENSION = ".XML";
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder folder = await rootFolder.GetFolderAsync(startingDir, CreationCollisionOption.OpenIfExists); //CreateFolderAsync(startingDir, CreationCollisionOption.OpenIfExists);
List<string> fileNames = await folder.GetFilesAsync(EXTENSION);
return fileNames;
}
...但是“EXTENSION”作为 GetFilesAsync() 的 arg 是不正确的。我明白了,“参数 1:无法从 'string' 转换为 'System.Threading.CancellationToken' ”
那么我需要做些什么来获取文件夹中的所有 *.XML 文件?
更新 3
这可以编译,但我完全不确定这是不是正确的方法,除了它只是从文件夹中获取所有文件,而不仅仅是那些匹配“* .XML”的文件:
public async Task<List<IFile>> GetXMLFiles(string fileType, string startingDir)
{
const string EXTENSION = ".XML";
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder folder = await rootFolder.GetFolderAsync(startingDir, System.Threading.CancellationToken.None);
IList<PCLStorage.IFile> fileNames = await folder.GetFilesAsync(System.Threading.CancellationToken.None);
return fileNames.ToList();
}