Спокойные сигналы и вопрос о наследовании

Поскольку в вопросе указывается переименование и копирование, а не переименование и перемещение файлов, решение, вероятно, должно убедиться, что файлы из исходного каталога не продублированы в месте назначения. Это усложняет решение.

Сценарий не может просто проверить наличие исходного файла в месте назначения, поскольку он был переименован как часть перемещения. Выполнение cmp или diff, вероятно, приводит к неэффективному использованию ресурсов, особенно если сравниваемые файлы представляют собой большие дампы базы данных (на что указывает расширение .sql).

В приведенном ниже решении я добавил файл манифеста, чтобы отследить, какие файлы были скопированы, но если бы я создавал его для себя, мне не понравился бы такой подход. Если файл манифеста был случайно удален или отредактирован, скрипт потеряет отслеживание того, какие файлы уже были скопированы, и при следующем запуске все файлы будут скопированы. Последовательная индексация имен файлов в каталоге назначения будет исключена. Если возможно, я думаю, что было бы лучше:

  • переименовать исходные файлы, чтобы отразить их скопированный статус, после чего исключить эти файлы из операции копирования
  • Rename & amp; переместите файлы из исходного каталога в место назначения

Обратите внимание, что при выполнении численных сравнений bash видит числа с ведущими нулями как восьмеричные. Вы можете удалить начальные нули при извлечении числа для сравнения, но я использовал $((10#$foo)) в условиях теста для указания десятичных чисел. Я думаю, что это испортило подсветку синтаксиса Переполнения стека - что неправильно трактует текст после # в 10# как комментарий.

#!/bin/bash

# Set source and destination paths
readonly SRC=src
readonly DEST=dest
readonly COPY_MANIFEST="${SRC}"/copied.txt

# $COPY_MANIFEST will keep track of which files have been copied
[[ -f "$COPY_MANIFEST" ]] || touch "$COPY_MANIFEST"

# Get the highest index in destination directory from the file numeric prefix
highest=0
for file in $DEST/*; do
    base=$(basename ${file})
    index=$(echo $base | sed 's/[^0-9]//g')
    # Compare numbers. Convert to decimal format because leading zeros denote octal numbers 
    [[ $((10#$highest)) -le $((10#$index)) ]] && highest=$index
done

# Rename and copy files from source to destination
for original in ${SRC}/*; do
    previously_copied=false

    # Don't process the manifest file
    [[ ${original} = $COPY_MANIFEST ]] && continue

    # If the source directory is empty, exit early
    [[ -f "$original" ]] || { echo "No source files in ${SRC}"; exit;}

    # Check the file has not already been copied - uses a manifest file rather 
    # than using tools like cmp or diff to check for duplicate files.
    while read line; do
        if [[ "${original}" = "${line}" ]]; then
            echo "${original} has already been renamed and copied."
            previously_copied=y
        fi
    done < "$COPY_MANIFEST"
    [[ $previously_copied = y ]] && continue

    # Get the base name of the file
    name=$(basename ${original})

    # Original question asks that all files greater than v000_179_crt_table_stat_flg.sql are copied.
    # If this requirement is not needed, the next 2 lines can be removed
    num=$(echo "$name" | sed 's/V[0-9]*_\([0-9]*\).*/\1/g')
    [[ $((10#$num)) -le $((179)) ]] && { echo "Not eligible"; continue; }

    # Build the new filename and copy
    # Get rid of the prefix, leaving the descriptive name
    name=${name#V[0-9]*_[0-9]*_}
    highest=$(( 10#$highest + 1 ))
    new_name=V${highest}__${name}
    cp ${original} ${DEST}/${new_name}

    # Update the manifest to prevent repeat copying
    echo ${original} >> $COPY_MANIFEST
done
12
задан Peter Mortensen 7 January 2010 в 23:05
поделиться

4 ответа

Думаю, проблема в множественном наследовании:

class matLinePlot : public QObject, public Plot3D
...

Я предполагаю, что Plot3D является подклассом QObject ? В этом случае вместо этого следует ввести

class matLinePlot : public Plot3D
...

.

10
ответ дан 2 December 2019 в 21:24
поделиться

SIGNAL (x) и SLOT (x) - это макросы, которые генерируют строковые литералы. Во время выполнения слоты и сигналы сопоставляются с использованием строковых сравнений сгенерированных литералов.

(Я бы добавил комментарий к комментарию mdec, но у меня недостаточно репутации)

2
ответ дан 2 December 2019 в 21:24
поделиться

Я считаю, что это будет работать, если сигнал Plot3D :: RotationChanged является общедоступным или защищенным. Вы уверены, что сигнал не является частным?

Редактировать:

Хотя я не смог найти конкретную ссылку, я должен сделать вывод, что сигналы всегда являются общедоступными. По крайней мере, тест, который я сделал здесь, показал, что я могу подключиться к сигналу, даже если он был объявлен в закрытом разделе класса.

Я также проверил, что сигнал, объявленный в QObject, может быть подключен с использованием подкласса QObject в операторе подключения, поэтому сигналы однозначно наследуются. Как я вижу в других ответах и ​​комментариях здесь, проблема должна быть в другом месте.

1
ответ дан 2 December 2019 в 21:24
поделиться

Неправильно -> см. Комментарии.

Я использую Qtopia в Uni, и мне кажется, что кто-то говорил что-то о промежутках в параметрах SIGNAL и SLOT для подключения.

Попробуйте использовать

QObject::connect(this, SIGNAL(rotationChanged(double,double,double)),
            this, SLOT(myRotationChanged(double,double,double)));

Я знаю, что это не кажется интуитивно понятным, поскольку C ++ не чувствителен к пробелам, однако я считаю, что это как-то связано с магией, которую Qtopia / QT использует при соединении сигналов и слотов. Это может относиться только к Qtopia, или я, возможно, услышал неправду, но попробуйте. Кроме того, являются ли сигналы общедоступными или защищенными, и включены ли вы соответствующие файлы заголовков?

0
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

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