{"id":19099209,"url":"https://github.com/diev/folderdoc","last_synced_at":"2026-06-24T00:32:28.400Z","repository":{"id":109041665,"uuid":"75931441","full_name":"diev/FolderDoc","owner":"diev","description":"Folders and Documents linkable in both directions.","archived":false,"fork":false,"pushed_at":"2017-04-28T13:16:41.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-22T09:45:52.266Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://diev.github.io/FolderDoc/","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/diev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-12-08T11:25:11.000Z","updated_at":"2017-01-10T16:59:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"5a07d5f1-d611-422f-85cd-1f13285efa91","html_url":"https://github.com/diev/FolderDoc","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/diev/FolderDoc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FFolderDoc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FFolderDoc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FFolderDoc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FFolderDoc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/diev","download_url":"https://codeload.github.com/diev/FolderDoc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/diev%2FFolderDoc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34712578,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T03:49:08.364Z","updated_at":"2026-06-24T00:32:28.382Z","avatar_url":"https://github.com/diev.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [FolderDoc](http://diev.github.io/FolderDoc/)\n\n[![Build status](https://ci.appveyor.com/api/projects/status/naqbx5c8kbjw2hmp?svg=true)](https://ci.appveyor.com/project/diev/folderdoc)\n[![GitHub Release](https://img.shields.io/github/release/diev/FolderDoc.svg)](https://github.com/diev/FolderDoc/releases/latest)\n\nFolders and Documents linkable in both directions.  \nПапки и документы со ссылками в обе стороны.\n\n## Сценарии использования\n\n### Сценарий 1: Папка с файлами\n\nЭмуляция обычной файловой папки с документами и подпапками с документами и в \nних - типичная иерархическая структура. У каждого документа/подпапки `Item` \nесть один `Parent` (нет его только у корневой папки) и сколько-то возможных \n`Children`. Собственно, такую иерархию можно было организовать и одной *Self \nReferencing* таблицей `Items`, но в такую модель данных заложена б*о*льшая \nуниверсальность, как это показано в нижеследующих сценариях.\n\nИменно по этому сценарию загружается начальный образец данных по древовидному\nсодержимому папки `MyDocuments` из профиля текущего пользователя.\n\n### Сценарий 2: Тегированные папки с пересекающимися файлами\n\nК ситуации сценария 1 добавляется возможность иметь более одного `Parent`, \nчто позволяет на один и тот же документ/подпапку `Item` попадать из разных \nмест по навигационному свойству `Children` и также перемещаться **в обратные \nстороны** по свойству `Parents`. Эту возможность дает таблица *Many-to-Many* \n`Links` с коллекцией пар связанных ею ключей `ParentId` и `ChildId`. \n\nТакой взаимосвязанный документ становится \"общим\" для нескольких папок - без \nнеобходимости его дублировать в каждую из них (как при использовании \nсценария 1) или создания линков средствами файловой системы. Более того, \nприложения к документу теперь выглядят действительно как приложения \n`Children` к `Item` - без необходимости создания дополнительных подпапок или \nзагромождения файловой системы рядом лежащими файлами без иерархической \nструктуры:\n\n * документ - приложения/фотографии к нему;\n * исходный текстовый документ - сканы страниц подписанного документа;\n * документ - разные редакции для разных назначений.\n\nТаким же образом можно организовать версионность документов - все в единой \nсистеме иерархичности - без необходимости подпапок и разрастания дублей \nодних файлов в одной куче с дублями других.\n\nТакже это позволяет создать систему, где каждый пользователь может хранить \nсвои собственные коллекции документов и папок в таблице `Folders` - \nнезависимо от физической организации хранения файлов на диске или в базе. \nСами файлы при этом можно переименовать по GUID `Item.Id` - для единообразия \nи большей сохранности - в том числе и в целях информационной безопасности, \nограничив к ним доступ как на извлечение отдельных документов, так и на \nхищение всей папки с документами.\n\nИ главное - можно выполнить *полнотекстовый поиск* для получения определенного \nдокумента, а от него уже найти все родительские папки/документы, с которыми он \nвзаимосвязан.\n\n*Возможно, все это уже сделано в Microsoft SharePoint, но с каждой новой версией \nон все монструознее и с все большими требованиями к ресурсам, в том числе \nлицензионным, а это решение нацелено на собственные задачи и возможность \nмиграции в среду ASP.NET Core на серверах без Windows.*\n\n### Сценарий 3: Каталог любых элементов\n\nПредыдущий сценарий 2 расширяется до универсального хранилища вообще любых \nэлементов задаваемого класса `Item`, который может входить сразу в несколько \nкатегорий `Parents` товаров, например, и при этом также иметь несколько \nсопутствующих товаров `Children`.\n\nЭто можно еще представить как интернет-магазин запчастей, где они подходят \nсразу к нескольким моделям (узлам) изделий и сами они, в свою очередь, \nсодержат более мелкие детали. Вся информация от этом управляется классом \n`Link` (таблица `Links`), а описание каждого элемента определяется классом \n`Item` (таблица `Items`). Сами каталоги деталей - класс `Folder` (таблица \n`Folders`). В дополнение - каждый элемент может содержать ссылки на файлы \nс инструкциями, лежащими на диске.\n\n## Особенности реализации\n\nПроект создан на C# с применением Entity Framework с подходом *Code First* \nс использованием WinForms и NET Framework 4 для работы в Windows XP и выше.\n\n## License\n\nLicensed under the [Apache License, Version 2.0](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiev%2Ffolderdoc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiev%2Ffolderdoc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiev%2Ffolderdoc/lists"}