常用的Hadoop 文件查看工具
时间:2022-04-21
本文章向大家介绍常用的Hadoop 文件查看工具,主要内容包括packages.config、Explorer.cs、运行结果如图:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
packages.config
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.Data.Edm" version="5.2.0" targetFramework="net45" />
<package id="Microsoft.Data.OData" version="5.2.0" targetFramework="net45" />
<package id="Microsoft.Hadoop.WebClient" version="0.12.5126.42915" targetFramework="net45" />
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="1.8.0.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net45" />
<package id="System.Spatial" version="5.2.0" targetFramework="net45" />
<package id="WindowsAzure.Storage" version="2.0.4.1" targetFramework="net45" />
</packages>
Explorer.cs
using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Hadoop.WebHDFS;
namespace HdfsExplore
{
public partial class Explorer : Form
{
private WebHDFSClient client;
public Explorer()
{
InitializeComponent();
if (!CreateClient())
{
return;
}
// 使用驱动器列表填充TreeView
PopulateDriveList();
}
//此过程使用驱动器列表填充TreeView
private async void PopulateDriveList()
{
TreeNode nodeTreeNode;
var imageIndex = 0;
var selectIndex = 0;
const int Removable = 2;
const int LocalDisk = 3;
const int Network = 4;
const int CD = 5;
//const int RAMDrive = 6;
Cursor = Cursors.WaitCursor;
//清除TreeView
tvFolders.Nodes.Clear();
nodeTreeNode = new TreeNode("Hadoop Root", 0, 0);
tvFolders.Nodes.Add(nodeTreeNode);
//设置节点集合
var nodeCollection = nodeTreeNode.Nodes;
var x = await client.GetDirectoryStatus("/");
foreach (var mo in x.Directories)
{
//switch (int.Parse(mo["DriveType"].ToString()))
//{
// case Removable: //removable drives
// imageIndex = 5;
// selectIndex = 5;
// break;
// case LocalDisk: //Local drives
// imageIndex = 6;
// selectIndex = 6;
// break;
// case CD: //CD rom drives
// imageIndex = 7;
// selectIndex = 7;
// break;
// case Network: //Network drives
// imageIndex = 8;
// selectIndex = 8;
// break;
// default: //defalut to folder
// imageIndex = 2;
// selectIndex = 3;
// break;
//}
imageIndex = 6;
selectIndex = 6;
//创建新的驱动器节点
nodeTreeNode = new TreeNode(mo.PathSuffix, imageIndex, selectIndex);
//添加新节点
nodeCollection.Add(nodeTreeNode);
}
//初始化文件ListView
InitListView();
Cursor = Cursors.Default;
}
private void tvFolders_AfterSelect(object sender, TreeViewEventArgs e)
{
//选择文件夹时填充文件夹和文件
Cursor = Cursors.WaitCursor;
//获取当前所选驱动器或文件夹
var nodeCurrent = e.Node;
//清除所有子文件夹
nodeCurrent.Nodes.Clear();
if (nodeCurrent.SelectedImageIndex == 0)
{
//重新填写驱动器列表
PopulateDriveList();
}
else
{
//填充子文件夹和文件夹文件
PopulateDirectory(nodeCurrent, nodeCurrent.Nodes);
}
Cursor = Cursors.Default;
}
protected void InitListView()
{
//初始化ListView控件
lvFiles.Clear();
//创建ListView的列标题
lvFiles.Columns.Add("名称", 150, HorizontalAlignment.Left);
lvFiles.Columns.Add("大小", 75, HorizontalAlignment.Right);
lvFiles.Columns.Add("上次访问", 140, HorizontalAlignment.Left);
lvFiles.Columns.Add("上次修改", 140, HorizontalAlignment.Left);
lvFiles.Columns.Add("用有者", 75);
lvFiles.Columns.Add("权限", 75);
}
protected async void PopulateDirectory(TreeNode nodeCurrent, TreeNodeCollection nodeCurrentCollection)
{
TreeNode nodeDir;
var imageIndex = 2; //未选择的图像索引
var selectIndex = 3; //选择图像索引
if (nodeCurrent.SelectedImageIndex != 0)
{
//用文件夹填充树视图
try
{
var directoryStatus = await client.GetDirectoryStatus(getFullPath(nodeCurrent.FullPath));
var dirs = directoryStatus.Directories;
//check path
//if (!dirs.Any())
//{
// MessageBox.Show("Directory or path " + nodeCurrent.ToString() + " does not exist.");
//}
//else
//{
//填充文件
PopulateFiles(nodeCurrent);
var stringDirectories = dirs.Select(x => x.PathSuffix).ToArray();
var stringFullPath = "";
var stringPathName = "";
//循环遍历所有目录
foreach (var stringDir in stringDirectories)
{
stringFullPath = stringDir;
stringPathName = GetPathName(stringFullPath);
//创建目录节点
nodeDir = new TreeNode(stringPathName, imageIndex, selectIndex);
nodeCurrentCollection.Add(nodeDir);
}
//}
}
catch (IOException e)
{
MessageBox.Show("Error: Drive not ready or directory does not exist.");
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show("Error: Drive or directory access denided.");
}
catch (Exception e)
{
MessageBox.Show("Error: " + e);
}
}
}
protected string GetPathName(string stringPath)
{
//获取文件夹的名称
var stringSplit = stringPath.Split('\');
var _maxIndex = stringSplit.Length;
return stringSplit[_maxIndex - 1];
}
protected async void PopulateFiles(TreeNode nodeCurrent)
{
//使用文件填充列表视图
var lvData = new string[6];
//清除列表
InitListView();
if (nodeCurrent.SelectedImageIndex != 0)
{
var directoryStatus = await client.GetDirectoryStatus(getFullPath(nodeCurrent.FullPath));
try
{
var files = directoryStatus.Files; // Directory.GetFiles(getFullPath(nodeCurrent.FullPath));
var stringFileName = "";
string dtCreateDate, dtModifyDate;
Int64 lFileSize = 0;
//循环遍历所有文件
foreach (var file in files)
{
stringFileName = file.PathSuffix;
//FileInfo objFileSize = new FileInfo(stringFileName);
lFileSize = file.Length;
dtCreateDate = Utility.JavaTicksToDatetime(file.AccessTime).ToString();
//GetCreationTime(stringFileName);
dtModifyDate = Utility.JavaTicksToDatetime(file.ModificationTime).ToString();
//GetLastWriteTime(stringFileName);
//创建列表视图数据
lvData[0] = GetPathName(stringFileName);
lvData[1] = formatSize(lFileSize);
lvData[2] = dtCreateDate;
lvData[3] = dtModifyDate;
lvData[4] = file.Owner;
lvData[5] = file.Permission;
//创建实际列表项
var lvItem = new ListViewItem(lvData, 0);
lvFiles.Items.Add(lvItem);
}
}
catch (IOException e)
{
MessageBox.Show("错误:驱动器未准备好或目录不存在.");
}
catch (UnauthorizedAccessException e)
{
MessageBox.Show("错误:驱动器或目录访问被拒绝.");
}
catch (Exception e)
{
}
// }
}
}
protected string getFullPath(string stringPath)
{
//获取完整路径
var stringParse = "";
//从路径中删除根目录.
stringParse = stringPath.Replace("Hadoop Root\", "/").Replace("\", "/");
return stringParse;
}
protected string getFullPath(TreeNode nodeCurrent)
{
var path = nodeCurrent.FullPath;
return getFullPath(path);
}
protected string formatSize(Int64 lSize)
{
//格式编号为KB
var stringSize = "";
var myNfi = new NumberFormatInfo();
Int64 lKBSize = 0;
if (lSize < 1024)
{
if (lSize == 0)
{
//0 byte
stringSize = "0";
}
else
{
//小于1K但不是零字节
stringSize = "1";
}
}
else
{
//转换为KB
lKBSize = lSize / 1024;
//默认格式的格式数字
stringSize = lKBSize.ToString("n", myNfi);
//移除 decimal
stringSize = stringSize.Replace(".00", "");
}
return stringSize + " KB";
}
private void menuItem2_Click(object sender, EventArgs e)
{
//退出应用
Close();
}
private void tvFolders_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button != MouseButtons.Right) return;
if (e.Node == null) return;
//MessageBox.Show(e.Node.FullPath);
tvFolders.SelectedNode = e.Node;
InitcmsOneRout();
cmsOneRout.Show(tvFolders, e.X, e.Y);
}
private void InitcmsOneRout()
{
cmsOneRout = new ContextMenuStrip();
var tmiEditRoutStation = new ToolStripMenuItem("修改Owner");
cmsOneRout.Items.Add(tmiEditRoutStation);
var changePermission = new ToolStripMenuItem("修改权限");
changePermission.Click += changePress_Click;
cmsOneRout.Items.Add(changePermission);
var tmiDel = new ToolStripMenuItem("删除");
tmiDel.Click += tmiDel_Click;
cmsOneRout.Items.Add(tmiDel);
}
async void changePress_Click(object sender, EventArgs e)
{
//if (lvFiles.SelectedItems.Count == 0)
// return;
if (tvFolders.SelectedNode == null)
return;
var remotepath = getFullPath(tvFolders.SelectedNode);
//var remotefile = remotepath.TrimEnd('/') + "/" + lvFiles.SelectedItems[0].Text;
var permissions = await client.GetFileStatus(remotepath);
InputName ip = new InputName("修改权限(" + remotepath + ")", permissions.Permission);
if (ip.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if (string.IsNullOrWhiteSpace(ip.StrInput))
{
MessageBox.Show("不能为空项");
return;
}
await client.SetPermissions(remotepath, ip.StrInput);
}
}
private void tmiDel_Click(object sender, EventArgs e)
{
var path = getFullPath(tvFolders.SelectedNode);
//client = new WebHDFSClient(new Uri("http://zhangbaowei:50070"), "hadoop");
client.DeleteDirectory(path, true);
MessageBox.Show("删除完成");
tvFolders.SelectedNode.Remove();
}
private void menuItem5_Click(object sender, EventArgs e)
{
var parentPath = "/";
if (tvFolders.SelectedNode != null)
{
parentPath = getFullPath(tvFolders.SelectedNode);
}
var name = new InputName();
if (name.ShowDialog() != DialogResult.OK)
return;
var newname = name.StrInput;
client.CreateDirectory(parentPath.TrimEnd('/') + "/" + newname);
}
private void menuItem6_Click(object sender, EventArgs e)
{
showSetting();
PopulateDriveList();
}
private void showSetting()
{
var setting = new Setting();
if (setting.ShowDialog() == DialogResult.OK)
{
CreateClient();
}
}
private bool CreateClient()
{
var url = AppConfig.GetValue("hdfsurl");
var username = AppConfig.GetValue("username");
if (string.IsNullOrWhiteSpace(url) || string.IsNullOrWhiteSpace(username))
{
MessageBox.Show("未进行正确配置");
showSetting();
return false;
}
client = new WebHDFSClient(new Uri(url), username);
return true;
}
private void menuItem7_Click(object sender, EventArgs e)
{
if (tvFolders.SelectedNode == null)
{
MessageBox.Show("未选中上传目标");
return;
}
OpenFileDialog of = new OpenFileDialog();
of.Multiselect = true;
if (of.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
var remotepath = getFullPath(tvFolders.SelectedNode);
var filename = of.FileNames;
foreach (var s in filename)
{
client.CreateFile(s, remotepath.TrimEnd('/') + "/" + Path.GetFileName(s));
}
PopulateFiles(tvFolders.SelectedNode);
}
}
private void menuItem8_Click(object sender, EventArgs e)
{
var items = lvFiles.SelectedItems;
var remotepath = getFullPath(tvFolders.SelectedNode);
foreach (var item in items)
{
var filename = ((ListViewItem)item).Text;
client.DeleteDirectory(remotepath.TrimEnd('/') + "/" + filename);
}
}
private async void lvFiles_MouseDoubleClick(object sender, MouseEventArgs e)
{
ListViewHitTestInfo info = lvFiles.HitTest(e.X, e.Y);
ListViewItem item = info.Item;
if (item != null)
{
//MessageBox.Show("The selected Item Name is: " + item.Text);
var remotepath = getFullPath(tvFolders.SelectedNode);
var remotefile = remotepath.TrimEnd('/') + "/" + item.Text;
var message = await client.OpenFile(remotefile);
var content = await message.Content.ReadAsStringAsync();
ContentViewer cv = new ContentViewer(content, remotefile);
cv.Show();
}
else
{
this.lvFiles.SelectedItems.Clear();
MessageBox.Show("No Item is selected");
}
}
private void lvFiles_MouseClick(object sender, MouseEventArgs e)
{
//判断鼠标是否右键
if (e.Button == MouseButtons.Right)
{
if (this.lvFiles.SelectedItems.Count > 0) //选中项
{
var cmslv = new ContextMenuStrip();
var tmiEditRoutStation = new ToolStripMenuItem("权限");
tmiEditRoutStation.Click += tmiEditRoutStation_Click;
cmslv.Items.Add(tmiEditRoutStation);
var tmiDelte = new ToolStripMenuItem("删除");
tmiDelte.Click += tmiDelte_Click;
cmslv.Items.Add(tmiDelte);
var downloadFile = new ToolStripMenuItem("下载");
downloadFile.Click += downloadFile_Click;
cmslv.Items.Add(downloadFile);
cmslv.Show(lvFiles, e.Location);
//this.lvFiles.ContextMenuStrip = cms选中菜单;
}
else //未选中项
{
//this.lvFiles.ContextMenuStrip = cms未选中菜单;
}
}
}
async void downloadFile_Click(object sender, EventArgs e)
{
if (lvFiles.SelectedItems.Count == 0)
return;
var remotepath = getFullPath(tvFolders.SelectedNode);
var filefolder = new FolderBrowserDialog();
if (filefolder.ShowDialog() != System.Windows.Forms.DialogResult.OK)
return;
var locafolder = filefolder.SelectedPath;
foreach (var lvFile in lvFiles.SelectedItems)
{
var removefilename = ((ListViewItem)lvFile).Text;
var remotefile = remotepath.TrimEnd('/') + "/" + removefilename;
var file = await client.OpenFile(remotefile);
var filebytes = await file.Content.ReadAsByteArrayAsync();
var locafile = locafolder + "/" + removefilename;
System.IO.File.WriteAllBytes(locafile, filebytes);
//lvFiles.Items.Remove((ListViewItem)lvFile);
}
MessageBox.Show("下载成功");
}
async void tmiDelte_Click(object sender, EventArgs e)
{
if (lvFiles.SelectedItems.Count == 0)
return;
var remotepath = getFullPath(tvFolders.SelectedNode);
foreach (var lvFile in lvFiles.SelectedItems)
{
var remotefile = remotepath.TrimEnd('/') + "/" + ((ListViewItem)lvFile).Text;
await client.DeleteDirectory(remotefile);
lvFiles.Items.Remove((ListViewItem)lvFile);
}
}
async void tmiEditRoutStation_Click(object sender, EventArgs e)
{
if (lvFiles.SelectedItems.Count == 0)
return;
var remotepath = getFullPath(tvFolders.SelectedNode);
var remotefile = remotepath.TrimEnd('/') + "/" + lvFiles.SelectedItems[0].Text;
InputName ip = new InputName("修改权限(" + remotefile + ")");
if (ip.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if (string.IsNullOrWhiteSpace(ip.StrInput))
{
MessageBox.Show("不能为空项");
return;
}
await client.SetPermissions(remotefile, ip.StrInput);
}
}
}
}
运行结果如图:
- 除了比特币,区块链技术能做的还有很多
- Progressive Web Apps入门
- IDEA入门级使用教程
- 掌握Docker命令-Docker for Web Developers(4)
- InfoPath中repeating section中赋值操作
- 百布(baibu.la)完成1.65亿B+轮融资
- 八大排序算法总结与java实现
- Angular企业级开发(5)-项目框架搭建
- 如何让nginx显示文件夹目录
- Facebook Graph API(2)--读取数据之picture
- 使用Dockerfile构建镜像-Docker for Web Developers(5)
- 2018年程序员的出路有哪些
- CSS魔法堂:不得不说的Containing Block
- Facebook Graph API(1)—介绍
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 04 . Jenkins部署Java项目
- java编程思想第四版第七章习题
- 03 . Jenkins构建之代码扫描
- mysql提示Packet for query is too large (1142 > 1024)解决方案
- Kubernetes 1.19.0——deployment(1)
- 02 . Jeknins简介部署及自动化部署PHP代码
- java编程思想第四版第八章习题
- java编程思想第四版第八章总结
- ESP32从网络获取天气OLED显示(附源码)
- 02 . Zabbix配置监控项及聚合图形
- 01 . GitLab简介及环境部署
- 03 . Prometheus监控容器和HTTP探针应用及服务发现
- java编程思想第四版第九章习题
- 03 . Django之腾讯云短信
- ESP32 MQTT连接到中移OneNET物联网平台(附源码)