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

时间:2014-03-24 16:59:11

标签: c# xamarin.android xamarin portable-class-library compact-framework2.0

我想知道可移植类库的功能是否比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解决方案中编译。我知道,&#34;名称&#39;目录&#39;在当前背景下不存在&#34;并右键单击该单词无法提供&#34;解决&#34;选项。

有没有办法让PCL识别&#34;目录&#34;或者我必须完全重写代码?如果是后者,是否有人对其做什么/使用有任何建议?

相关地,是否有一个URL可以显示PCL和/或一个网站中可用的内容,该网站将显示提供的代码块有多少&#34; PCL-ready&#34;?< / p>

更新

this article中的第一张图片非常有启发性。后来,它专门讨论&#34;目录&#34;在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;
}

...但是&#34; EXTENSION&#34;因为GetFilesAsync()的arg不对。我得到了这个,&#34; 参数1:无法转换为&#39; string&#39;到&#39; System.Threading.CancellationToken&#39; &#34;

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

更新3

这是编译,但我完全不确定它是否正确的方法,除了它只是从文件夹中获取所有文件的事实,而不是而不仅仅是匹配&#34; * .XML&#34;:

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();
}

4 个答案:

答案 0 :(得分:2)

因为在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);
        }
    }

答案 1 :(得分:1)

  

Windows Phone应用程序不使用操作的文件系统   系统并限制使用隔离存储来保持和   访问文件,因此此命名空间不提供任何其他内容   功能。

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

答案 2 :(得分:1)

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

有关如何处理来自PCL的非便携式API的一些指导,请参阅我的博文:How to Make Portable Class Libraries Work for You

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

答案 3 :(得分:1)

如果您的所有平台都受到支持,则另一个选择是使用Shim

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