public void File_list(
            string path,
            ystring ydirectory,
            ystring yfile,
            string sskip = "0",
            string stake = "10",
            ystring done = null)
        {
#if Android
            var DIRECTORY_DCIM = global::android.os.Environment.DIRECTORY_DCIM;

            path = global::android.os.Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM).getAbsolutePath();
            path += "/Camera";

            var f = new File(path);

            //Caused by: java.lang.Runtim
            //eException: Implement IComparable for java.lang.Long vs java.lang.Long
            //       at ScriptCoreLibJava.BCLImplementation.System.Collections.__Comparer.Compare(__Comparer.java:136)

            var a = f.listFiles().Where(k => k.getName().EndsWith(".jpg")).OrderByDescending(k => (double)k.lastModified()).ToArray();

            //foreach (var item in a)
            //{
            //    if (new File(path + "/" + item).isDirectory())
            //        ydirectory(path + "/" + item);
            //}

            int skip = int.Parse(sskip);
            int take = int.Parse(stake);

            foreach (var item in a)
            {
                if (skip > 0)
                {
                    skip--;
                }
                else
                {
                    if (take > 0)
                    {
                        take--;


                        yfile(path + "/" + item.getName());

                    }
                    else
                    {
                        break;
                    }
                }
            }
#endif

            if (done != null)
                done("");
        }
        public void File_list(
            string path,
            ystring ydirectory,
            ystring yfile,
            string sskip = "0",
            string stake = "10",
            ystring done = null)
        {
            var DIRECTORY_DCIM = android.os.Environment.DIRECTORY_DCIM;

            path = android.os.Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM).getAbsolutePath();
            path += "/Camera";

            var f = new File(path);

            var a = f.list();

            foreach (var item in a)
            {
                if (new File(path + "/" + item).isDirectory())
                    ydirectory(path + "/" + item);
            }

            int skip = int.Parse(sskip);
            int take = int.Parse(stake);

            foreach (var item in a)
            {
                if (skip > 0)
                {
                    skip--;
                }
                else
                {
                    if (take > 0)
                    {
                        take--;

                        if (new File(path + "/" + item).isFile())
                            yfile(path + "/" + item);

                    }
                    else
                    {
                        break;
                    }
                }
            }

            done("");
        }
        public void SaveChanges(string path, XElement c, ystring y)
        {
#if DEBUG
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(path);
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine(c.ToString());
            Console.ForegroundColor = ConsoleColor.Gray;
#endif
            path = path.Replace("%20", " ");

            AddItem(path,
                c.ToString(),
                delegate
                {
                    y();
                }
            );

        }
        public void GetEXIF(string path, ystring yield)
        {

            var is_io = path.StartsWith(io);
            var is_thumb = path.StartsWith(thumb);

            var filepath = path.SkipUntilIfAny(io);

            if (is_thumb)
            {
                filepath = path.SkipUntilIfAny(thumb);
            }

            // is this still a problem?
            filepath = filepath.Replace("%20", " ");

            var file = new File(filepath);


            if (file.exists())
                if (file.isFile())
                    if (path.EndsWith(".jpg"))
                    {

                        file.print(yield);

                    }
        }
        public Task File_list(
            // jsc, can we have events yet, thanks, webrtc?
            ystring yfile
            )
        {
            // this will crash for empty nexus
            // ?

            var sw = Stopwatch.StartNew();
            System.Console.WriteLine("enter File_list " + new { sw.ElapsedMilliseconds });

            var skip = this.skip;
            var take = this.take;


            var DIRECTORY_DCIM = global::android.os.Environment.DIRECTORY_DCIM;

            var path = global::android.os.Environment.getExternalStoragePublicDirectory(DIRECTORY_DCIM).getAbsolutePath();
            path += "/Camera";


            // X:\jsc.svn\examples\java\hybrid\JVMCLRLINQOrderByLastWriteTime\JVMCLRLINQOrderByLastWriteTime\Program.cs
            var AllFiles = Enumerable.ToArray(
                from fname in System.IO.Directory.GetFiles(path)
                let ff = new System.IO.FileInfo(fname)
                let LastWriteTime = ff.LastWriteTime
                //orderby LastWriteTime
                orderby LastWriteTime descending
                select new { fname, ff, LastWriteTime }
            );

            System.Console.WriteLine("File_list " + new { AllFiles = AllFiles.Length, sw.ElapsedMilliseconds });

            var FilesAfterSkipAndTake = AllFiles.Skip(skip).Take(take).ToArray();

            System.Console.WriteLine("File_list " + new { FilesAfterSkipAndTake = FilesAfterSkipAndTake.Length, sw.ElapsedMilliseconds });

            FilesAfterSkipAndTake.WithEach(
                item =>
                {
                    yfile(item.ff.FullName);
                }
            );

            System.Console.WriteLine("exit File_list " + new { sw.ElapsedMilliseconds });


            return "".AsResult();
        }
        public static void print(this File file, ystring yield)
        {
            // https://code.google.com/p/metadata-extractor/wiki/GettingStarted

            var w = new StringBuilder();

            w.AppendLine("metadata: ");

            try
            {
#if xmetadata
  //<package id="AndroidMetadataExtractor" version="1.0.0.0" targetFramework="net40" />

                // http://drewnoakes.com/code/exif/
                Metadata m = ImageMetadataReader.readMetadata(file);


                //            [javac] V:\src\DCIMCameraAppWithThumbnails\ApplicationWebService.java:191: unreported exception com.drew.imaging.ImageProcessingException; must be caught or declared to be thrown
                //[javac]                     metadata4 = ImageMetadataReader.readMetadata(file3);
                //[javac]                                                                 ^


                // Error	12	'com.drew.metadata.Metadata.getDirectories()' is not supported by the language	X:\jsc.svn\examples\javascript\android\com.abstractatech.dcimgalleryapp\com.abstractatech.dcimgalleryapp\ApplicationWebService.cs	1000	25	com.abstractatech.dcimgalleryapp
                // Error	13	'com.drew.metadata.Directory.getErrors()' is not supported by the language	X:\jsc.svn\examples\javascript\android\com.abstractatech.dcimgalleryapp\com.abstractatech.dcimgalleryapp\ApplicationWebService.cs	1019	38	com.abstractatech.dcimgalleryapp

                var i = m.getDirectories().iterator();

                while (i.hasNext())
                {
                    var directory = (Directory)i.next();

                    var tags = directory.getTags().toArray();

                    foreach (Tag tag in tags)
                    {

                        w.AppendLine(new { tag }.ToString());
                    }


                    if (directory.hasErrors())
                    {

                        var ierror = directory.getErrors().iterator();

                        while (ierror.hasNext())
                        {
                            var error = (string)ierror.next();

                            w.AppendLine(new { error }.ToString());
                        }
                    }
                }
#endif

                w.AppendLine("end of metadata");

            }
            catch (Exception ex)
            {
                w.AppendLine("error " + new { ex.Message, ex.StackTrace });
            }
            yield(w.ToString());

        }
        public void SaveChanges(string path, XElement c, ystring y)
        {
            //Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine(path);
            //Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine(c.ToString());
            //Console.ForegroundColor = ConsoleColor.Gray;

            AddItem(path,
                c.ToString(),
                delegate
                {
                    y();
                }
            );

        }