我需要做些什么来使这个代码在Portable Class Library中工作?

我想知道可移植类库在function上是否比Compact Framework更受限制。

我正在尝试将CF / Windows CE应用程序(在手持设备上运行)移植到Xamarin解决方案,该解决方案将针对Android,iOS,Windows Phone以及其他东西。

但是,我遇到的一个问题是这个遗留代码(在CF下运行):

public static List 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(); 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就绪”的站点?

UPDATE

本文中的第一张图片非常有启发性。 后来,它专门讨论了PCL场景中无法使用的“目录”。

更新2

我下载了Daniel Plaisted引用的PCLStorage包,允许我访问PCL项目中的文件系统。

使用下载页面开头的示例代码[http://pclstorage.codeplex.com/]作为起点,我已经做到了这一点:

 public async Task<List> 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 fileNames = await folder.GetFilesAsync(EXTENSION); return fileNames; } 

…但是“EXTENSION”作为GetFilesAsync()的arg是不对的。 我得到了这个,“ 参数1:无法从’string’转换为’System.Threading.CancellationToken’

那么我需要做什么才能将所有* .XML文件放到文件夹中?

更新3

这编译,但我不确定这是正确的方法,除了它只是从文件夹中获取所有文件,而不仅仅是那些匹配“* .XML”的文件:

 public async Task<List> 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 fileNames = await folder.GetFilesAsync(System.Threading.CancellationToken.None); return fileNames.ToList(); } 

Windows Phone应用程序不使用操作系统的文件系统,并且仅限于使用隔离存储来持久存取和访问文件,因此此命名空间不提供任何其他function。

http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.io%28v=vs.105%29.aspx

因为在PCL中我无法从字符串中获取StreamWriter(它需要一个流),所以我创建了一个简单的接口来从平台实现中获取一些数据。 您也可以使用DirectoryInfo和FileInfo执行此操作。

https://github.com/sami1971/SimplyMobile/blob/master/Core/SimplyMobile.Text/IStreamLocator.cs

实现也很简单,WP8只需要一个编译器标志:

https://github.com/sami1971/SimplyMobile/blob/master/WP8/SimplyMobile.Text.Platform/StreamLocator.cs

递归搜索* .XML文件:

  private static void PrintDirectory(IStreamLocator locator, string dir) { foreach (var file in locator.GetFileNames(dir, "*.XML")) { System.Diagnostics.Debug.WriteLine(file); } foreach (var di in locator.GetFolderNames(dir, "*")) { PrintDirectory(locator, di); } } 

Xamarin有一个扫描仪,可以让您大致了解代码的可移植性: http : //scan.xamarin.com/

有关如何处理来自PCL的非便携式API的一些指导,请参阅我的博客文章: 如何使便携式类库为您工作

特别是对于文件IO,您可以尝试我的PCL存储库。

另一个选择是在Shim支持所有平台的情况下使用Shim 。

文件操作的API覆盖范围并不详尽,但它可以帮到您。 作为奖励,它还可以让您访问其他一些东西。