Local File Access - Building a Local File System TreeView
When a Silverlight application is running with elevated permissions it has access to the local file system. In previous versions of Silverlight if you wanted to browse the local file system then you couldn't, all you could do was present the user with a OpenFileDialog.
Not anymore, in Silverlight 4 you can access the local file system, read folder and file lists, open, edit and save files. In this example you will need to be running the Silverlight application in Out of Browser mode.
Also available to view and download is the full Local File Explorer demo.
You need to login to Download example, If you do not have a login you can register for free!
In this example we use the Liquid TreeView to build a tree structure of the local file system.
<UserControl x:Class="LocalFileTree.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:liquidTreeView="clr-namespace:Liquid;assembly=Liquid.TreeView"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<liquidTreeView:Tree x:Name="fileTree" Grid.Row="0" EnableLines="True" Populate="FileTree_Populate" />
</Grid>
</UserControl>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.IO;
using Liquid;
namespace LocalFileTree
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
if (App.Current.HasElevatedPermissions)
{
fileTree.BuildRoot();
}
}
private void FileTree_Populate(object sender, TreeEventArgs e)
{
Node node = (Node)sender;
if (sender is Tree)
{ // We are populating the root nodes collection
fileTree.Nodes.Add(new Node(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "My Documents", true, "images/folder.png", "images/folderOpen.png", true));
fileTree.Nodes[0].Expand();
}
else
{ // Otherwise we are populating a node
PopulateNode(node);
}
}
private void PopulateNode(Node node)
{
var folders = Directory.EnumerateDirectories(node.ID);
var files = Directory.EnumerateFiles(node.ID);
FileInfo info;
DirectoryInfo dir;
foreach (string s in folders)
{
dir = new DirectoryInfo(s);
node.Nodes.Add(new Node(s, dir.Name, true, "images/folder.png", "images/folderOpen.png", true));
}
foreach (string s in files)
{
info = new FileInfo(s);
node.Nodes.Add(new Node(s, info.Name, false, "images/" + GetIcon(info.Name)));
}
}
private string GetIcon(string filename)
{
string[] split = filename.Split('.');
string extension = string.Empty;
if (split.Length > 0)
{
extension = split[split.Length - 1].ToLower();
}
if (extension != "pdf" && extension != "xls" && extension != "doc" && extension != "gif" && extension != "mp3" &&
extension != "xlsx" && extension != "docx" && extension != "avi" && extension != "jpg" &&
extension != "mp4" && extension != "png" && extension != "xml" && extension != "zip")
{
extension = "unknown";
}
return extension + ".png";
}
}
}
Here we use the Liquid TreeView which generates a Populate event when a node needs to be populated for example after it has been expanded. In the populate event handler we retrieve a list of folders and files for the current node and create the child nodes.
Your Comments
Post your Comments
Rate this page:
1 Star
2 Star
3 Star
4 Star
5 Star
8 Ratings / 2.5 Average