Не удается получить доступ к определенным файлам в Ubuntu?

Ответ под строкой был написан в 2008 году.

В C # 7 введено сопоставление с образцом, которое в значительной степени заменило оператор as, как теперь можно написать:

if (randomObject is TargetType tt)
{
    // Use tt here
}

Обратите внимание, что tt все еще находится в области видимости после этого, но не определенно назначен , (Он определенно определен в теле if.) В некоторых случаях это немного раздражает, поэтому, если вы действительно хотите ввести наименьшее число переменных, возможных в каждой области, вы все равно можете использовать is с последующим приведением.


Я не думаю, что какой-либо из ответов до сих пор (во время запуска этого ответа!) действительно объяснил, где стоит использовать какой.

  • Не делайте этого:

    // Bad code - checks type twice for no reason
    if (randomObject is TargetType)
    {
        TargetType foo = (TargetType) randomObject;
        // Do something with foo
    }
    

    Мало того, что это проверка дважды, но это может быть проверка разных вещей, если randomObject является полем, а не локальным переменная. Возможно, что «если» пройдет, но тогда приведение не будет выполнено, если другой поток изменяет значение randomObject между двумя.

  • Если randomObject действительно должно быть экземпляром TargetType, то есть, если это не так, это означает, что есть ошибка, тогда приведение является правильным решением. Это немедленно вызывает исключение, что означает, что больше нет работы при неправильных предположениях, и исключение правильно показывает тип ошибки.

    // This will throw an exception if randomObject is non-null and
    // refers to an object of an incompatible type. The cast is
    // the best code if that's the behaviour you want.
    TargetType convertedRandomObject = (TargetType) randomObject;
    
  • Если randomObject может быть экземпляром TargetType и TargetType является ссылочным типом, то используйте код, подобный этому:

    TargetType convertedRandomObject = randomObject as TargetType;
    if (convertedRandomObject != null)
    {
        // Do stuff with convertedRandomObject
    }
    
  • Если randomObject может быть экземпляром TargetType и TargetType является типом значения, то мы не можем использовать as с TargetType сам по себе, но мы можем использовать обнуляемый тип:

    TargetType? convertedRandomObject = randomObject as TargetType?;
    if (convertedRandomObject != null)
    {
        // Do stuff with convertedRandomObject.Value
    }
    

    (Примечание: в настоящее время это на самом деле медленнее, чем + cast . Я думаю, что это более элегантно и последовательно, но мы идем .)

  • Если вам действительно не нужно преобразованное значение, но вам просто нужно знать, является ли оно экземпляром TargetType, тогда is оператор твой друг. В этом случае не имеет значения, является ли TargetType ссылочным типом или типом значения.

  • Могут быть и другие случаи использования дженериков, когда is полезен (потому что вы можете не знать, является ли T ссылочным типом или нет, поэтому вы не можете использовать как), но они относительно неясны.

    [1 144]
  • Я почти наверняка использовал is для случая типа значения до сих пор, не думая об использовании обнуляемого типа и as вместе:)


РЕДАКТИРОВАТЬ: Обратите внимание, что ни один из вышеперечисленных не говорит о производительности, кроме случая типа значения, где я заметил, что распаковка в тип значения, допускающий значение NULL, на самом деле медленнее - но согласованно.

В соответствии с ответом Наасккинга, «и заброшенный» или «и» и «как» так же быстро, как и «нулевая проверка» с современными JIT, как показано кодом ниже:

using System;
using System.Diagnostics;
using System.Linq;

class Test
{
    const int Size = 30000000;

    static void Main()
    {
        object[] values = new object[Size];
        for (int i = 0; i < Size - 2; i += 3)
        {
            values[i] = null;
            values[i + 1] = "x";
            values[i + 2] = new object();
        }
        FindLengthWithIsAndCast(values);
        FindLengthWithIsAndAs(values);
        FindLengthWithAsAndNullCheck(values);
    }

    static void FindLengthWithIsAndCast(object[] values)        
    {
        Stopwatch sw = Stopwatch.StartNew();
        int len = 0;
        foreach (object o in values)
        {
            if (o is string)
            {
                string a = (string) o;
                len += a.Length;
            }
        }
        sw.Stop();
        Console.WriteLine("Is and Cast: {0} : {1}", len,
                          (long)sw.ElapsedMilliseconds);
    }

    static void FindLengthWithIsAndAs(object[] values)        
    {
        Stopwatch sw = Stopwatch.StartNew();
        int len = 0;
        foreach (object o in values)
        {
            if (o is string)
            {
                string a = o as string;
                len += a.Length;
            }
        }
        sw.Stop();
        Console.WriteLine("Is and As: {0} : {1}", len,
                          (long)sw.ElapsedMilliseconds);
    }

    static void FindLengthWithAsAndNullCheck(object[] values)        
    {
        Stopwatch sw = Stopwatch.StartNew();
        int len = 0;
        foreach (object o in values)
        {
            string a = o as string;
            if (a != null)
            {
                len += a.Length;
            }
        }
        sw.Stop();
        Console.WriteLine("As and null check: {0} : {1}", len,
                          (long)sw.ElapsedMilliseconds);
    }
}

[1163 На моем ноутбуке все это выполняется примерно за 60 мс. Следует отметить две вещи:

  • Между ними нет существенной разницы. (На самом деле, существуют ситуации, в которых проверка as-plus-null-проверки определенно медленнее . Приведенный выше код на самом деле делает проверку типа легкой, потому что это для запечатанного класса; если вы проверяете для интерфейс, баланс немного склоняется в пользу проверки как плюс-ноль.)
  • Они все безумно быстро. Это просто не будет узким местом в вашем коде, если вы действительно не собираетесь делать что-либо со значениями впоследствии.

Так что давайте не будем беспокоиться о производительности. Давайте позаботимся о правильности и последовательности.

Я утверждаю, что is-and-cast (или is-and-as) небезопасны при работе с переменными, так как тип значения, на которое он ссылается, может измениться из-за другого потока между тестом и приведением. Это было бы довольно редкой ситуацией - но я бы предпочел иметь соглашение, которое я могу использовать последовательно.

Я также утверждаю, что проверка "как тогда ноль" дает лучшее разделение проблем У нас есть одно утверждение, которое пытается преобразовать, а затем одно утверждение, которое использует результат. Метод is-and-cast или is-and-as выполняет тест и затем еще одну попытку преобразовать значение.

Говоря иначе, кто-нибудь когда-либо напишет:

int value;
if (int.TryParse(text, out value))
{
    value = int.Parse(text);
    // Use value
}

Это что-то вроде того, что делает актерский состав - хотя, очевидно, более дешевым способом.

-3
задан 07.05.2020, 00:20

2 ответа

Easy. Вы можете просто запустить:

sudo chown [[your username]] [[path to directory]]

Следует отметить, что этот инструмент имеет силу. Вы должны только изменить владельца (если он сломан) вашей домашней папки.

У меня была эта проблема с Apache, в папке / var / www. Это сработало там.

Поскольку вирусы на платформе Ubuntu / linux встречаются очень редко, я бы порекомендовал, если это не сработает, попробуйте переустановить Ubuntu вообще. Сделайте резервную копию ваших файлов, скопировав их во что-то внешнее, а затем используйте внешний образ для переустановки Ubuntu.

-2
ответ дан 07.05.2020, 00:21
  • 1
    Это - ужасный совет и отличный способ повредить Ubuntu. – Ethaan 07.05.2020, 00:21
  • 2
    соединить каналом к каталогу? как файлы это говорит, что я не владею? файлы говорят, что они - корневые файлы, и корень является владельцем. – thejartender 07.05.2020, 00:21
  • 3
    Вы shouldn' t смешивают с файлами, принадлежавшими корню, если Вы действительно не знаете то, что Вы делаете. – greijner 07.05.2020, 00:22

Сначала добро пожаловать в Ubuntu. Ничто из того, что вы описали, не звучит ненормально, и хотя возможно, что вас «взломали», это крайне маловероятно.

Как и в любой ОС, требуется некоторое время, чтобы понять, что является новыми и новыми способами системного администрирования.

Я предлагаю вам начать со следующих 2 ссылок:

https://help.ubuntu.com/community/FilePermissions

https: / /help.ubuntu.com/community/RootSudo

А затем изучите официальную документацию

https://help.ubuntu.com/

Как только вы начнете, возвращайтесь, если у вас есть более конкретный вопрос.

4
ответ дан 07.05.2020, 00:21

Теги

Похожие вопросы