Delirium
02-12-2008, 08:41
В данной ветке часто возникает вопрос - а как же можно ЗАПРЕТИТЬ копировать файлы определенных разрешений в некоторые папки на сервере? Дабы не кидали фильмы, музыку и прочее, но Server 2003 R2 с его File Resource Manager поставить нет возможности...
Чтобы помочь страждущим, предлагаю небольшую консольную утилитку. В чем её суть:
указываете в параметрах запуска папку на сервере и расширение, например так: fsw.exe \\server\share *.avi . Утилитка запустит простейший мониторинг данной папки и будет кидать в файл log.txt изменения, произошедшие в данной папке именно с указанными типами файлов.
Приведу исходный код и готовый exe:
using System;
using System.IO;
namespace FileSystemWatcherTest
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
if (args.Length != 0)
{
try
{
// Создаем наблюдателя
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[0]; //первый параметр при запуске
// Будем следить за изменениями по последнему доступу,
// времени записи и переименованию файла или директорий
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Будем следить только за указанными файлами
watcher.Filter = args[1]; //второй параметр при запуске
// Добавляем обработчики событий
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Включаем наблюдение
watcher.EnableRaisingEvents = true;
// Ждем пока пользователь не нажмет клавишу q
Console.WriteLine("Наблюдение запущено. Нажмите \'q\' для выхода.");
while (Console.Read() != 'q') ;
}
catch (Exception msg_ex)
{
Console.WriteLine(msg_ex.Message);
}
}
else
{
Console.WriteLine(@"Формат запуска: fsw.exe 1 2");
Console.WriteLine(@"1-путь до папки с указанием последнего слеша (C:\temp\ или \\server\share\)");
Console.WriteLine(@"2-тип файлов (*.jpg)");
Console.WriteLine("Логи пишутся в файл log.txt в папке с fsw.exe");
Console.WriteLine("Нажмите \'q\' для выхода.");
while (Console.Read() != 'q') ;
}
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
StreamWriter sw;
sw = File.AppendText("log.txt");
sw.WriteLine(DateTime.Now.ToLocalTime().ToString() + " Файл: " + e.FullPath + " " + e.ChangeType);
sw.Close();
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
StreamWriter sw;
sw = File.AppendText("log.txt");
sw.WriteLine("Файл: {0} был переименован в {1}", e.OldFullPath, e.FullPath);
sw.Close();
}
}
}
Соответственно, если вам необходимо просто вжесткую удалять файлы при попытке их копирования на сервер, можно просто добавить строку File.Delete(e.FullPath) после строк sw.Close(); и он будет удаляться.
Данный код можно практически без изменений сделать службой.
Не претендую на уникальность, но вдруг кому то пригодится :) Если будет необходимо, перепишу под нужные запросы/параметры.
P.S. Огромное спасибо Павлу Агурову и его книге "C# Сборник рецептов" за простые и понятные коды. Кстати, очень рекомендую.
Тема рассчитана на обладателей NT/2000/2003
Первые двоим нужно ещё .net 1.0 или 1.1 установить, прежде чем проследовать по инструкции по компиляции исходника. Обладателям NT он правда будет не к чему, а вот обладателям 2000-го думаю, что всё же нужен.
Обладатели 2003-го могут приступать сразу же к инструкции:
1)Скопируйте код из сообщения, вставьте в блокнот, сохраните его в файл, например под именем fsw.cs.
2)Зайдите в консоли в директорию в которую сохранили этот файл, наберите команду
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\csc.exe fsw.cs
в пути вместо .4322 может быть другое число в зависимости от установленного Сервис пака, данное справедливо для 2003 Sp2[/i]
4)В этой же директории Вы получите файл скомпилированный (exe) и готовый к работе файл.
Почему именно 1.1? Потому что он встроенный в 2003, не все обладатели последнего ставят 2.0, а то и 3.0/3.5.
Кстати он будет весить всего лишь 5,00 KB (5 120 bytes), чего там студия кроме иконки компилятору велела написать остаётся по ту сторону этой сборки ехе.
Чтобы помочь страждущим, предлагаю небольшую консольную утилитку. В чем её суть:
указываете в параметрах запуска папку на сервере и расширение, например так: fsw.exe \\server\share *.avi . Утилитка запустит простейший мониторинг данной папки и будет кидать в файл log.txt изменения, произошедшие в данной папке именно с указанными типами файлов.
Приведу исходный код и готовый exe:
using System;
using System.IO;
namespace FileSystemWatcherTest
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
if (args.Length != 0)
{
try
{
// Создаем наблюдателя
FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = args[0]; //первый параметр при запуске
// Будем следить за изменениями по последнему доступу,
// времени записи и переименованию файла или директорий
watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite
| NotifyFilters.FileName | NotifyFilters.DirectoryName;
// Будем следить только за указанными файлами
watcher.Filter = args[1]; //второй параметр при запуске
// Добавляем обработчики событий
watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);
watcher.Renamed += new RenamedEventHandler(OnRenamed);
// Включаем наблюдение
watcher.EnableRaisingEvents = true;
// Ждем пока пользователь не нажмет клавишу q
Console.WriteLine("Наблюдение запущено. Нажмите \'q\' для выхода.");
while (Console.Read() != 'q') ;
}
catch (Exception msg_ex)
{
Console.WriteLine(msg_ex.Message);
}
}
else
{
Console.WriteLine(@"Формат запуска: fsw.exe 1 2");
Console.WriteLine(@"1-путь до папки с указанием последнего слеша (C:\temp\ или \\server\share\)");
Console.WriteLine(@"2-тип файлов (*.jpg)");
Console.WriteLine("Логи пишутся в файл log.txt в папке с fsw.exe");
Console.WriteLine("Нажмите \'q\' для выхода.");
while (Console.Read() != 'q') ;
}
}
private static void OnChanged(object source, FileSystemEventArgs e)
{
StreamWriter sw;
sw = File.AppendText("log.txt");
sw.WriteLine(DateTime.Now.ToLocalTime().ToString() + " Файл: " + e.FullPath + " " + e.ChangeType);
sw.Close();
}
private static void OnRenamed(object source, RenamedEventArgs e)
{
StreamWriter sw;
sw = File.AppendText("log.txt");
sw.WriteLine("Файл: {0} был переименован в {1}", e.OldFullPath, e.FullPath);
sw.Close();
}
}
}
Соответственно, если вам необходимо просто вжесткую удалять файлы при попытке их копирования на сервер, можно просто добавить строку File.Delete(e.FullPath) после строк sw.Close(); и он будет удаляться.
Данный код можно практически без изменений сделать службой.
Не претендую на уникальность, но вдруг кому то пригодится :) Если будет необходимо, перепишу под нужные запросы/параметры.
P.S. Огромное спасибо Павлу Агурову и его книге "C# Сборник рецептов" за простые и понятные коды. Кстати, очень рекомендую.
Тема рассчитана на обладателей NT/2000/2003
Первые двоим нужно ещё .net 1.0 или 1.1 установить, прежде чем проследовать по инструкции по компиляции исходника. Обладателям NT он правда будет не к чему, а вот обладателям 2000-го думаю, что всё же нужен.
Обладатели 2003-го могут приступать сразу же к инструкции:
1)Скопируйте код из сообщения, вставьте в блокнот, сохраните его в файл, например под именем fsw.cs.
2)Зайдите в консоли в директорию в которую сохранили этот файл, наберите команду
%SystemRoot%\Microsoft.NET\Framework\v1.1.4322\csc.exe fsw.cs
в пути вместо .4322 может быть другое число в зависимости от установленного Сервис пака, данное справедливо для 2003 Sp2[/i]
4)В этой же директории Вы получите файл скомпилированный (exe) и готовый к работе файл.
Почему именно 1.1? Потому что он встроенный в 2003, не все обладатели последнего ставят 2.0, а то и 3.0/3.5.
Кстати он будет весить всего лишь 5,00 KB (5 120 bytes), чего там студия кроме иконки компилятору велела написать остаётся по ту сторону этой сборки ехе.