Я предполагаю, что Вы используете GCC. Стандартное решение состояло бы в том, чтобы представить с gprof.
убедиться добавить -pg
к компиляции перед профилированием:
cc -o myprog myprog.c utils.c -g -pg
я еще не попробовал его, но я услышал хорошие вещи приблизительно google-perftools . Это определенно стоит попытки.
Связанный вопрос здесь .
Несколько других модных словечек, если gprof
не делает задания для Вас: Valgrind, Intel VTune, Sun DTrace.
Ответы Ричарда и Джейсона в некотором роде правильное направление. Однако вам следует вычислить действующие разрешения для удостоверения пользователя, выполняющего ваш код. Ни один из приведенных выше примеров, например, не учитывает членство в группе.
Я почти уверен, что Кейт Браун имел код для этого в его версии вики (в настоящее время не в сети ) из . Руководство для разработчиков .NET по безопасности Windows . Это также достаточно подробно обсуждается в его книге Программирование безопасности Windows .
Вычисление эффективных разрешений не для слабонервных, и ваш код, пытающийся создать файл и перехватить выброшенное исключение безопасности, вероятно, путь наименьшего сопротивления.
Directory.GetAccessControl (path)
выполняет то, что вы просите.
public static bool HasWritePermissionOnDir(string path)
{
var writeAllow = false;
var writeDeny = false;
var accessControlList = Directory.GetAccessControl(path);
if (accessControlList == null)
return false;
var accessRules = accessControlList.GetAccessRules(true, true,
typeof(System.Security.Principal.SecurityIdentifier));
if (accessRules ==null)
return false;
foreach (FileSystemAccessRule rule in accessRules)
{
if ((FileSystemRights.Write & rule.FileSystemRights) != FileSystemRights.Write)
continue;
if (rule.AccessControlType == AccessControlType.Allow)
writeAllow = true;
else if (rule.AccessControlType == AccessControlType.Deny)
writeDeny = true;
}
return writeAllow && !writeDeny;
}
(FileSystemRights.Write & rights) == FileSystemRights.Write
использует что-то под названием «Флаги "Кстати, если вы не знаете, что это такое, вам стоит прочитать:)
IMO, вам нужно работать с такими каталогами как обычно, но вместо проверки разрешений перед использованием, укажите правильный способ обработки исключения UnauthorizedAccessException и отреагируйте соответствующим образом. Этот метод проще и менее подвержен ошибкам.
Попробуйте поработать с этим фрагментом C #, который я только что создал:
using System;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string directory = @"C:\downloads";
DirectoryInfo di = new DirectoryInfo(directory);
DirectorySecurity ds = di.GetAccessControl();
foreach (AccessRule rule in ds.GetAccessRules(true, true, typeof(NTAccount)))
{
Console.WriteLine("Identity = {0}; Access = {1}",
rule.IdentityReference.Value, rule.AccessControlType);
}
}
}
}
И вот ссылка, на которую вы также можете посмотреть.