internal static void HandleUnchainedOrFirstFile(RootFolderHandlerBase rootFolderHandlerBase, EnhancedFileInfo theFile)
        {
            theFile.Item.Location = theFile.FileInformation.FullName;
            theFile.Item.ExternalID = theFile.Item.Location.ToLower();

            if (rootFolderHandlerBase.Importer.TagMasks != null)
            {

                FileTagsRetriever.GetTagsOfFile
                    (rootFolderHandlerBase, theFile);

            }

            theFile.Item.Name = theFile.Item.Tags.Get("name", String.Empty) as string;

            rootFolderHandlerBase.Importer.ImageLinker.LinkAllImages(theFile);

            if (!rootFolderHandlerBase.IsNewItem && !rootFolderHandlerBase.Update)
                return;

            rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "  Getting filesystem information"));

            if (rootFolderHandlerBase.Importer.FileSize)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.FileSizeTagName]
                    = theFile.FileInformation.Length;
            }

            if (rootFolderHandlerBase.Importer.CreationDate)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.CreationDateTagName]
                    = theFile.FileInformation.CreationTime.ToString("yyyy-MM-dd hh:mm:ss");
            }

            if (rootFolderHandlerBase.Importer.LastAccessDate)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.LastAccessDateTagName]
                    = theFile.FileInformation.LastAccessTime.ToString("yyyy-MM-dd hh:mm:ss");
            }

            if (rootFolderHandlerBase.Importer.LastModificationDate)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.LastModificationDateTagName]
                    = theFile.FileInformation.LastWriteTime.ToString("yyyy-MM-dd hh:mm:ss");
            }

            if (rootFolderHandlerBase.Importer.SerialNumber)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.SerialNumberTagName] = rootFolderHandlerBase.InfoOfDrive.SerialNumber;
            }

            if (rootFolderHandlerBase.Importer.VolumeName)
            {
                theFile.Item.Tags[rootFolderHandlerBase.Importer.VolumeNameTagName] = rootFolderHandlerBase.InfoOfDrive.VolumeLabel;
            }
        }
        internal static void HandleChainedFile(RootFolderHandlerBase rootFolderHandlerBase,
             EnhancedFileInfo theFile, 
             EnhancedFileInfo previousFile)
        {
            if ((!rootFolderHandlerBase.IsNewItem)
                && (!rootFolderHandlerBase.Update))
            {
                return;
            }

            var location = new MLTag
                ("item_location",
                previousFile.Item.Location);

            location.Values.Add(theFile.FileInformation.FullName);

            location.Values.Sort();

            previousFile.Item.Location = location.Value;

            previousFile.Item.ExternalID
                = previousFile.Item.Location.ToLower();

            if (rootFolderHandlerBase.Importer.FileSize)
            {
                previousFile.Item.Tags[rootFolderHandlerBase.Importer.FileSizeTagName] =
                    (long)previousFile.Item.Tags[rootFolderHandlerBase.Importer.FileSizeTagName] + theFile.FileInformation.Length;
            }

            if (rootFolderHandlerBase.Importer.CreationDate)
            {
                object creationDate = previousFile.Item.Tags[rootFolderHandlerBase.Importer.CreationDateTagName];
                if (creationDate is string)
                {
                    if (!String.IsNullOrEmpty((string)creationDate))
                    {
                        if (String.CompareOrdinal(theFile.FileInformation.CreationTime.ToString("yyyy-MM-dd hh:mm:ss"), (string)creationDate) < 0)
                        {
                            previousFile.Item.Tags[rootFolderHandlerBase.Importer.CreationDateTagName] = theFile.FileInformation.CreationTime.ToString("yyyy-MM-dd hh:mm:ss");
                        }
                    }
                }
            }

            if (rootFolderHandlerBase.Importer.LastAccessDate)
            {

                object lastAccessDate = previousFile.Item.Tags[rootFolderHandlerBase.Importer.LastAccessDateTagName];

                if (lastAccessDate is string)
                {
                    if (!String.IsNullOrEmpty((string)lastAccessDate))
                    {
                        if (String.CompareOrdinal(theFile.FileInformation.LastAccessTime.ToString("yyyy-MM-dd hh:mm:ss"), (string)lastAccessDate) > 0)
                        {
                            previousFile.Item.Tags[rootFolderHandlerBase.Importer.LastAccessDateTagName] = theFile.FileInformation.LastAccessTime.ToString("yyyy-MM-dd hh:mm:ss");
                        }
                    }
                }
            }

            if (!rootFolderHandlerBase
                .Importer.LastModificationDate)
                return;

            object lastModificationDate
                = previousFile.Item.Tags
                [rootFolderHandlerBase
                .Importer.LastModificationDateTagName];

            var modificationDate = lastModificationDate as string;

            if (modificationDate == null)
                return;

            if (String.IsNullOrEmpty
                (modificationDate))
                return;

            if (String.CompareOrdinal
                (theFile.FileInformation
                    .LastWriteTime.ToString
                    ("yyyy-MM-dd hh:mm:ss"),
                    modificationDate) <= 0)
                return;

            previousFile.Item.Tags
                [rootFolderHandlerBase
                .Importer.LastModificationDateTagName]
                = theFile.FileInformation
                .LastWriteTime.ToString
                ("yyyy-MM-dd hh:mm:ss");
        }
        protected internal static void GetTagsOfFile(RootFolderHandlerBase rootFolderHandlerBase,
             EnhancedFileInfo theFile)
        {
            bool tagMaskMatched = false;
            const string folderPattern = "(?:.*\\\\)*";

            rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "  Retrieving tags"));
            MLItem.AddBaseTagsToTags(theFile.Item);
            if (rootFolderHandlerBase.Importer.ImportFromAlternateDataStream)
            {
                AlternateDataStreamReader adsReader = new AlternateDataStreamReader(rootFolderHandlerBase.File);
                adsReader.ReadItem();
            }

            theFile.SuccessfulTagMaskMatch = rootFolderHandlerBase.Importer.TagMasks.Count == 0;

            foreach (TagMask tagMask in rootFolderHandlerBase.Importer.TagMasks)
            {

                if (tagMask.Mask.Length == 0)
                {
                    tagMaskMatched = false;
                }
                else if (!tagMaskMatched)
                {

                    if (!rootFolderHandlerBase.RootFolder.EndsWith("\\"))
                    {
                        rootFolderHandlerBase.RootFolder += "\\";
                    }

                    string rootFolderPattern = RootFolderHandlerBase
                        .PatternFixEscapeChars
                        (rootFolderHandlerBase.RootFolder);

                    string regExpPattern = rootFolderPattern + folderPattern + tagMask.RegExp;

                    try
                    {

                        Regex tagValuesFinder = new Regex
                            (regExpPattern,
                             RegexOptions.IgnoreCase);

                        MatchCollection matches
                            = tagValuesFinder.Matches
                            (theFile.Item.Location
                            .Replace("._", ' ')
                            .ReplaceLast(' ', '.'));

                        if (matches.Count == 1)
                        {
                            tagMaskMatched = true;
                            theFile.SuccessfulTagMaskMatch = true;
                            Match match = matches[0];
                            rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "    Matched tagmask: " + tagMask.Mask));
                            int groupPos = 0;
                            int tagPos = 0;
                            foreach (Group group in match.Groups)
                            {
                                if (groupPos > 0)
                                {
                                    while (tagMask.Tags[tagPos].Name.Length == 0)
                                    {
                                        tagPos++;
                                    }

                                    theFile.Item.Tags[tagMask.Tags[tagPos].Name] = @group.Value;
                                    tagPos++;
                                }

                                groupPos++;
                            }
                        }
                        else
                        {
                            rootFolderHandlerBase.LogMessages.Enqueue(
                                new LogMessage("Info", "    No match for tagmask: " + tagMask.Mask));
                        }
                        //// LogMessages.Enqueue(new LogMessage("Info", String.Empty));
                    }
                    catch (ArgumentException ex)
                    {
                        string logMessage = "RegEx could not be generated from the tag mask \"" +
                                            tagMask.Mask + "\"" + " (Exception: " + ex.Message + ")";
                        rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Error", logMessage));
                    }

                }

            }

            rootFolderHandlerBase.Importer
                .TagValuesReplacementRules
                .ApplyRulesToItem(theFile.Item);
        }
        /// <param name="rootFolderHandlerBase"> </param>
        /// <exception cref="Exception"><c>Exception</c>.</exception>
        internal static void Execute(RootFolderHandlerBase rootFolderHandlerBase)
        {
            try
            {

                //// EnhancedFileInfo PreviousFile = null;
                for (rootFolderHandlerBase.FilePos
                    = rootFolderHandlerBase.Files.Count - 1;
                    rootFolderHandlerBase.FilePos > -1;
                    rootFolderHandlerBase.FilePos--)
                {

                    if (rootFolderHandlerBase.FilePos == -1)
                    {

                        throw new Exception
                            ("CancelUpdateThreadError");

                    }

                    rootFolderHandlerBase.File
                        = rootFolderHandlerBase
                        .Files[rootFolderHandlerBase.FilePos];

                    rootFolderHandlerBase.LogMessages.Enqueue(
                        new LogMessage
                            ("Info",
                             "Getting info for file: "
                             + rootFolderHandlerBase.File
                                   .FileInformation
                                   .FullName));

                    if (rootFolderHandlerBase.Files.Count > 0)
                    {
                        int percentage = 100 - ((rootFolderHandlerBase.FilePos * 100) / rootFolderHandlerBase.Files.Count);
                        string text = "Getting info for file: " + rootFolderHandlerBase.File.FileInformation.FullName;
                        if (!rootFolderHandlerBase.Import.CheckProgress(percentage, text))
                        {
                            rootFolderHandlerBase.Import.CancelUpdate = true;
                            return;
                        }
                    }

                    rootFolderHandlerBase.File.Item
                        = rootFolderHandlerBase
                        .FindItemByLocationContaining
                        (rootFolderHandlerBase.File
                        .FileInformation.FullName) ??
                        new MLItem(null);

                    rootFolderHandlerBase.IsNewItem
                        = rootFolderHandlerBase.File.Item.ID == 0;

                    rootFolderHandlerBase.Update
                        = (!rootFolderHandlerBase.IsNewItem) &&
                        (rootFolderHandlerBase.Importer.AlwaysUpdate ||
                        (rootFolderHandlerBase.File.Item.DateChanged
                        < rootFolderHandlerBase.File.FileInformation.LastWriteTime));

                    if (rootFolderHandlerBase.IsNewItem)
                    {
                        rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "  Created new item"));
                    }
                    else
                    {
                        rootFolderHandlerBase.LogMessages.Enqueue(rootFolderHandlerBase.Update
                                                                      ? new LogMessage("Info", "  Updating already existing item")
                                                                      : new LogMessage("Info", "  Skiping already existing item"));
                    }

                    if (rootFolderHandlerBase.Update
                        || rootFolderHandlerBase.Import.Importer.AlwaysUpdateImages
                        || rootFolderHandlerBase.IsNewItem)
                    {

                        rootFolderHandlerBase.DoSpecificHandling();

                        if (rootFolderHandlerBase.Importer.ExportToAlternateDataStream)
                        {
                            var adsWriter = new AlternateDataStreamWriter(rootFolderHandlerBase.File);
                            adsWriter.WriteItem();
                        }

                        if (rootFolderHandlerBase.Importer.ExcludeUnmatchedFiles)
                        {
            ////                            if ((this.Importer.TagMasks.Count > 0) && (this.File.Item.Location.Length > 0) &&
            ////                                (this.File.Item.Tags.Count == 0))
                            if (!rootFolderHandlerBase.File.SuccessfulTagMaskMatch)
                            {
                                rootFolderHandlerBase.Import.UnmatchedFiles.Add(rootFolderHandlerBase.File);
                                rootFolderHandlerBase.Files.Remove(rootFolderHandlerBase.File);
                            }
                        }

                        /*
                        if (Importer.ChainingOption == ChainOption.ChainByTags)
                        {
                            if ((!IsNewItem) && (!Update))
                            {
                                Files.Remove(File);
                            }
                            else
                            {
                                EnhancedFileInfo TempFile = new EnhancedFileInfo(File.FI);
                                HandleUnchainedOrFirstFile(TempFile);
                                IMLItem CachedItem = Import.itemsChainedByTagCache.Query(TempFile.Item);
                                if (CachedItem != TempFile.Item)
                                {
                                    File = Import.Item2File.Query(CachedItem);
                                    HandleChainedByTagFile(File, TempFile);
                                    if (Import.Item2File.RetrivedItemWasCached)
                                    {
                                        Files.RemoveAt(FilePos);
                                    }
                                    else
                                    {
                                        Files[FilePos] = File;
                                    }
                                }
                                else
                                {
                                    Files[FilePos] = TempFile;
                                    Import.Item2File.Add(TempFile);
                                }
                            }
                        }
                        else
                        {
                            if ((!Importer.ChainFiles) || (PreviousFile == null) || (File.FI.DirectoryName != PreviousFile.FI.DirectoryName))
                            {
                                HandleUnchainedOrFirstFile(File);
                                PreviousFile = File;
                            }
                            else
                            {
                                HandleChainedFile(File, PreviousFile);
                                Files.Remove(File);
                            }
                        }
            */
                    }
                    else
                    {
                        rootFolderHandlerBase.Files.Remove(rootFolderHandlerBase.File);
                    }

                    rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", "...Done"));
                    rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Info", Environment.NewLine));
                }
            }
            catch (Exception ex)
            {
                rootFolderHandlerBase.LogMessages.Enqueue(new LogMessage("Error", ex.ToString()));
                throw;
            }
        }