95 lines
3.4 KiB
C#
95 lines
3.4 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using Umbraco.Core.IO;
|
|||
|
|
using Umbraco.Web.Models.Trees;
|
|||
|
|
|
|||
|
|
namespace Umbraco.Web.Trees
|
|||
|
|
{
|
|||
|
|
public abstract class FileSystemTreeController : TreeController
|
|||
|
|
{
|
|||
|
|
protected abstract string FilePath { get; }
|
|||
|
|
protected abstract string FileSearchPattern { get; }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Inheritors can override this method to modify the file node that is created.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xNode"></param>
|
|||
|
|
protected virtual void OnRenderFileNode(ref TreeNode treeNode) { }
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Inheritors can override this method to modify the folder node that is created.
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xNode"></param>
|
|||
|
|
protected virtual void OnRenderFolderNode(ref TreeNode treeNode) { }
|
|||
|
|
|
|||
|
|
protected override Models.Trees.TreeNodeCollection GetTreeNodes(string id, System.Net.Http.Formatting.FormDataCollection queryStrings)
|
|||
|
|
{
|
|||
|
|
string orgPath = "";
|
|||
|
|
string path = "";
|
|||
|
|
if (!string.IsNullOrEmpty(id) && id != "-1")
|
|||
|
|
{
|
|||
|
|
orgPath = id;
|
|||
|
|
path = IOHelper.MapPath(FilePath + "/" + orgPath);
|
|||
|
|
orgPath += "/";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
path = IOHelper.MapPath(FilePath);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
DirectoryInfo dirInfo = new DirectoryInfo(path);
|
|||
|
|
DirectoryInfo[] dirInfos = dirInfo.GetDirectories();
|
|||
|
|
|
|||
|
|
var nodes = new TreeNodeCollection();
|
|||
|
|
foreach (DirectoryInfo dir in dirInfos)
|
|||
|
|
{
|
|||
|
|
if ((dir.Attributes & FileAttributes.Hidden) == 0)
|
|||
|
|
{
|
|||
|
|
var HasChildren = dir.GetFiles().Length > 0 || dir.GetDirectories().Length > 0;
|
|||
|
|
var node = CreateTreeNode(orgPath + dir.Name, orgPath, queryStrings, dir.Name, "icon-folder", HasChildren);
|
|||
|
|
|
|||
|
|
OnRenderFolderNode(ref node);
|
|||
|
|
if(node != null)
|
|||
|
|
nodes.Add(node);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//this is a hack to enable file system tree to support multiple file extension look-up
|
|||
|
|
//so the pattern both support *.* *.xml and xml,js,vb for lookups
|
|||
|
|
string[] allowedExtensions = new string[0];
|
|||
|
|
bool filterByMultipleExtensions = FileSearchPattern.Contains(",");
|
|||
|
|
FileInfo[] fileInfo;
|
|||
|
|
|
|||
|
|
if (filterByMultipleExtensions)
|
|||
|
|
{
|
|||
|
|
fileInfo = dirInfo.GetFiles();
|
|||
|
|
allowedExtensions = FileSearchPattern.ToLower().Split(',');
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
fileInfo = dirInfo.GetFiles(FileSearchPattern);
|
|||
|
|
|
|||
|
|
foreach (FileInfo file in fileInfo)
|
|||
|
|
{
|
|||
|
|
if ((file.Attributes & FileAttributes.Hidden) == 0)
|
|||
|
|
{
|
|||
|
|
if (filterByMultipleExtensions && Array.IndexOf<string>(allowedExtensions, file.Extension.ToLower().Trim('.')) < 0)
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
var node = CreateTreeNode(orgPath + file.Name, orgPath, queryStrings, file.Name, "icon-file", false);
|
|||
|
|
|
|||
|
|
OnRenderFileNode(ref node);
|
|||
|
|
|
|||
|
|
if(node != null)
|
|||
|
|
nodes.Add(node);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return nodes;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|