Attachments mit Unterordnern verschieben

Thomas K. hinzugefügt 34 Tagen her
beantwortet

Hallo!


Ich organisiere meine Projekte gerade um bzw. bringe sie von Google Drive zu One Drive.

Genau genommen machen ich das nur mit den Attachments. Die Citavi-DBs liegen auf meinem lokalen Laufwerk.

Allerdings bearbeitet ich die Attachments auch mit anderen Geräten (u. a. iPad) - und dafür ist die Citavi-Cloud nicht vorgesehen. Aber das nur am Rande und zur Einordnung meiner Frage.

Nun lasse ich die Attachments von Citavi (Datei/ Dieses Projekt/ Eigenschaften.../ Anhänge) auf den neuen Pfad verschieben.

Das klappt auch gut.

Nur habe ich unter den Attachments auch weitere Ordner (z. B. für (Studien-)Materialien, Vorträge, Verlaufsdokumente, Modelle etc. zu einem Titel). Diese Ordner sind nach dem Kurztitel benannt.

Diese Unterordner sind als "Internetadressen" (leider ist Citavi hier nicht besonders zeitgemäß und nutzerfreundlich - aber die, die das nutzen, wissen wie das geht und was ich meine) im jeweiligen Eintrag hinterlegt.

Die Unterordner verschiebt mir Citavi leider nicht.

Über die Funktion "Pfade korrigieren..." habe ich es auch schon probiert - erfolglos.

Ich müsste in jeden Titel (Eintrag) gehen und die Ordner dort wieder hinzufügen.

Wie kann ich das alles in einem Rutsch machen?

Danke

Kommentare (10)

Foto
1

Hallo Thomas,

vielen Dank für Ihre Frage.

Ich konnte die über den Button "Internetadresse" ergänzten Unterordner mit folgendem Vorgehen erfolgreich umziehen:

  1. Unter "Datei" > "Dieses Projekt" > "Eigenschaften" > "Anhänge" auf "Durchsuchen" klicken und den gewünschten neuen Ordner auswählen und auf "OK" klicken.
  2. Citavi 6 schließen.
  3. Mit dem Windows Dateimanager alle selbst erstellten Unterordner aus dem bisherigen Attachment-Verzeichnis (in der Regel C:\Users\[IHR.NAME]\Documents\Citavi 6\Projects\[PROJEKTNAME]\Citavi Attachments) in den neuen Attachment-Ordner kopieren.
  4. Das Citavi-6-Projekt wieder öffnen.

Ergebnis: Die manuell über den Workaround verlinkten Unterordner werden wieder erkannt - dies funktioniert aber vermutlich nur, wenn diese vorher schon im Citavi-Projekt mit einem Ordner-Icon und dem [Citavi]-Hinweis gekennzeichnet waren.

46161502f962b6b0b29d1cc7cab74c61

Viele Grüße

Susanne

Foto
1

Hallo Susanne!


Das ist ja Klasse. Es funktioniert. Ich hatte das Projekt nicht geschlossen.

Zudem war ich verunsichert, da alle PDF und Bilder auf den neuen Pfad umgezogen sind, nicht aber die Ordner. Diese waren nun getrennt auf dem alten Pfad vorhanden und ich habe sie händisch auf den neuen Pfad verschoben.

Abe wie von dir beschrieben...


Vielen Dank nochmal und einen schönen Abend

Foto
1

Hallo Thomas,

gern geschehen und vielen Dank für Ihre freundliche Rückmeldung.

Viele Grüße

Susanne

Foto
1

Ich knüpfe noch einmal hier an und hoffe, dass das auch gelesen wird.

Wie kann ich einzelne Attachments im selben Projekt in Unterordner verschieben, ohne dass ich die Wissenselemente neu verknüpfen muss?

Foto
1

Entschuldigung, ich dachte, ich hätte auch den Makrocode gepostet, wenn man es ohne AddOn machen möchte:


using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.Linq;
using System.IO;
using System.Text;
using System.Threading;
using System.Globalization;

using SwissAcademic.Citavi;
using SwissAcademic.Citavi.Metadata;
using SwissAcademic.Citavi.Shell;
using SwissAcademic.Collections;

using System.Reflection;
using SwissAcademic.Citavi.Shell.Controls.Preview;

public static class CitaviMacro
{
	public static void Main()
	{
		if (Program.ProjectShells.Count == 0) return;		//no project open
		
		Program.ActiveProjectShell.PrimaryMainForm.PreviewControl.ShowNoPreview();
		
		// User Options
		
		// Static Variables
		
		Project activeProject = Program.ActiveProjectShell.Project;
		string citaviAttachmentsFolderPath = activeProject.Addresses.AttachmentsFolderPath;
		List<Reference> references = Program.ActiveProjectShell.PrimaryMainForm.GetSelectedReferences();
		
		// Dynamic Variables
		
		string targetFolder = string.Empty;

		int renameCounter = 0;
		List<Reference> renamingFailed = new List<Reference>();
		
		var fbd = new FolderBrowserDialog();

		// The Magic
		
		targetFolder  = citaviAttachmentsFolderPath;
				
		fbd.SelectedPath = targetFolder;
		DialogResult result = fbd.ShowDialog();
		if (result == DialogResult.Cancel) return;
		targetFolder = fbd.SelectedPath;

		foreach (Reference reference in references)
		{
			List<Location> attachments = reference.Locations.ToList().Where(a => a.LocationType == LocationType.ElectronicAddress && a.Address.LinkedResourceType == LinkedResourceType.AttachmentFile).ToList();	
			
			foreach (Location location in attachments)
			{			
				if (location == null)
				{
					renamingFailed.Add(reference);
					continue;
				}
				if (location.Address == null)
				{
					renamingFailed.Add(reference);
					continue;
				}
				if (location.Address.UriString == null)
				{
					renamingFailed.Add(reference);
					continue;
				}
				
				string oldFilePath = (citaviAttachmentsFolderPath + "\\" + location.Address.UriString);
												
				FileInfo fileInfo = new FileInfo(oldFilePath);
				
				string fileExtension = fileInfo.Extension;
				if (fileExtension.Equals("pdf", StringComparison.InvariantCultureIgnoreCase))
				{
					renamingFailed.Add(reference);
					continue;
				}
				
				string fileName = fileInfo.Name;
								
				string newAbsoluteFilePath = targetFolder + @"\" + fileName;
				
				if (newAbsoluteFilePath.Equals(oldFilePath)) continue;
			
				if (File.Exists(newAbsoluteFilePath))
				{
					// renamingFailed.Add(reference);
					// continue;
				}
				
				try
				{
					location.Address.ChangeFilePathAsync(new System.Uri(newAbsoluteFilePath), AttachmentAction.Move);
					renameCounter++;
				}
				catch (Exception e)
				{
					MessageBox.Show("An error has occured while renaming " + location.Address + ":\n" + e.Message, "Citavi Macro", MessageBoxButtons.OK, MessageBoxIcon.Error);
					renamingFailed.Add(reference);
				}				
			}// end foreach (Location location in reference.Locations)			
		}// foreach (Reference reference in references)

		// Message upon completion
		
		string message = "{0} Locations have been renamed.";
		message = string.Format(message, renameCounter);

		if (renamingFailed.Count == 0)
		{
			MessageBox.Show(message, "Citavi Macro", MessageBoxButtons.OK, MessageBoxIcon.Information);
			return;
		}
		else
		{
			DialogResult showFailed = MessageBox.Show(message + "\n Would you like to show a selection of references where renaming has failed?", "Citavi Macro", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
			if (showFailed == DialogResult.Yes)
			{
				var filter = new ReferenceFilter(renamingFailed, "Renaming failed", false);
				Program.ActiveProjectShell.PrimaryMainForm.ReferenceEditorFilterSet.Filters.ReplaceBy(new List<ReferenceFilter> { filter });
				return;
			}
		}
		
		activeProject.SaveAsync();
	}
}

Foto
1

Super, @SirPounce!

Aber ich hatte dein AddOn schon einmal probiert (in einem Testprojekt) und in deinem Thread geschrieben, dass die vorherigen, also vor Installation des AddOns, erstellten WE einfach weg waren. Das ist im Produktiveinsatz natürlich alles andere als gut...

Gibt es nicht eine andere Lösung?

Oder gibt es das Problem mit deinem AddOn nur temporär?

Ich dachte an die Projekteigenschaften/ Anhänge und dann "Pfade korrigieren" - aber eben nur für ausgewählte Titel, da ein Großteil der Attachments eben richtig "liegen".

Der Code sieht wie VB aus ;-)

Foto
2

Hmm, ich hatte das mit den verschwundenen Wissenselementen nicht, das ist ggf. in der letzten Version auch nicht der Fall. Selbst im schlimmsten Fall sollte das AddOn auch nicht zum Verschwinden der WEs führen sondern es stürzt nur das Element ab, was diese anzeigt (das ist ein bisschen sehr vereinfacht, was passiert).

Der Code ist C#, die Makro-Funktion ist im Handbuch beschrieben (sorry, ich schaff das hier am Handy nicht den Link zu kopieren, ist für mich aber der erste Treffer, wenn ich Citavi und Makro Google).  Das Makro macht exakt das gleiche, wie die Funktion im AddOn. Es öffnet ein Fenster zur Ordnerwahl, und da werden dann die Anhänge aller markierten Titel rein geschoben.

On Tue, 30 Jun 2020, 23:29 Citavi Team, <service@citavi.com> wrote:

Foto
1

Danke für deine Antwort, SirPounce.

Ich werde es (nochmal) ausprobieren, bei Gelegenheit - und ich hoffe, dass ich zu dieser zeitnah kommen werde... (dieses Semester...)

Ist der Code in deinem Git Repo aktuell?

Stimmt, es ist C# ;-)

Was schrieb denn das Citavi Team am 30.06.2020?

Übrigens würde ich es super finden, wenn die Funktion des Verschiebens bei gleichzeitigem Erhalt der Notationen in einer baldigen Version von Citavi erscheint. Vielleicht kann dein Aufwand genutzt werden, SirPounce?!

Foto
1

Das Citavi–Team schrieb nichts, das sieht nur so aus, weil mein Forumseintrag einfach entstanden ist, indem ich auf „Antworten“ im E-Mail-Programm geklickt habe.

Foto
1

Ah ok.


Und meine Frage zum Repo?

Foto
1

Hallo SirPounce und Citavi.

Nach dem AddOn bekomme ich bei jedem Wechsel einer Quelle - extrem nervig - folgenden Fehler. Übrigens auch, wenn ich nichts verschoben habe. Habe die DLL im AddOns jetzt vom Laden ausgeschlossen (Endung umbenannt).

Die Errormassages habe ich auch an die Citavi-Server geschickt.

Technical Information for the Citavi Team:
pdftron.Common.PDFNetException: Exception: 
	 Message: MappingManager file not found: PFAD\TITEL.pdf
	 Conditional expression: fs::exists(some_path)
	 Version    : 7.0.1.72235
	 Filename   : MappingManager.cpp
	 Function   : trn::Filters::MappingManager::Init
	 Linenumber : 116

   bei pdftron.PDF.PDFDoc..ctor(String filepath)
   bei SwissAcademic.Pdf.Document..ctor(String path)
   bei QuotationsToolbox.PDFUtilities.GetPageWidths(IEnumerable`1 locations)
   bei QuotationsToolbox.QuotationsSorter.SortActiveReferenceQuotations()
   bei QuotationsToolbox.UI.MainForm_ActiveReferenceChanged(Object o, EventArgs a)
   bei SwissAcademic.Citavi.Shell.MainForm.OnActiveReferenceChanged()
   bei SwissAcademic.Citavi.Shell.MainForm.ChangeActiveReference(Reference reference)
   bei SwissAcademic.Citavi.Shell.MainForm.referenceEditorNavigationGrid_AfterRowActivate(Object sender, EventArgs e)
   bei Infragistics.Win.UltraWinGrid.UltraGrid.OnAfterRowActivate()
   bei Infragistics.Win.UltraWinGrid.UltraGrid.FireEvent(GridEventIds id, EventArgs e)
   bei Infragistics.Win.UltraWinGrid.UltraGrid.OnActiveRowChange(UltraGridRow newActiveRow, Boolean scrollIntoView)
   bei Infragistics.Win.UltraWinGrid.UltraGridBase.SetActiveRow(UltraGridRow row, Boolean scrollIntoView)
   bei Infragistics.Win.UltraWinGrid.UltraGridRow.Activate()
   bei Infragistics.Win.UltraWinGrid.UltraGridRow.SetFocusAndActivate(Boolean byMouse, Boolean enterEditMode, Boolean byTabKey)
   bei Infragistics.Win.SelectionStrategyExtended.OnMouseDown(ISelectableItem item, MouseMessageInfo& msginfo, Boolean forceDrag)
   bei Infragistics.Win.ControlUIElementBase.ProcessMouseDownHelper(Object sender, MouseEventArgs e)
   bei Infragistics.Win.ControlUIElementBase.ProcessMouseDown(Object sender, MouseEventArgs e)
   bei Infragistics.Win.Utilities.ProcessEvent(Control control, ProcessEvent eventToProcess, EventArgs e)
   bei Infragistics.Win.UltraWinGrid.UltraGrid.OnMouseDown(MouseEventArgs e)
   bei SwissAcademic.Controls.UltraGrid.OnMouseDown(MouseEventArgs e)
   bei System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
   bei System.Windows.Forms.Control.WndProc(Message& m)
   bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

Foto
Foto
1

Sehr, sehr schade, dass jetzt wohl niemand mehr mitliest, wenn es Probleme gibt.

Ein kurzer Status: Ohne AddOn gibt es keine Fehler in Citavi.

Foto
1

Ich glaube, man kann es dem Citavi-Team nicht verdenken, dass es keinen Support leisten kann in Bezug auf ein AddOn, welches von dritten Parteien, welche nach Eigenauskunft nicht einmal programmieren können, entwickelt wird. Eigentlich gibt es bei Github auch die Funktion, Bugs zu melden, damit das vom Forum getrennt werden kann.

Was mich anbelangt, so ist es mir auch nicht immer möglich, Support innerhalb von 48 Stunden zu leisten, da ich das hier größtenteils in meiner Freizeit mache. Manchmal bin ich sogar im Urlaub!

Ich würde dann doch eher von der Verwendung des AddOns abraten, und betrachte das hier als erledigt, da das gewünschte Ziel sich genauso mit dem Makro erreichen lässt.

Foto
1

Hallo Thomas,

vielen Dank für Ihre Nachricht.

Wir können in der Tat leider keinen Support leisten für externe Add-ons, auch wenn wir uns natürlich freuen, wenn ein Anwender ein eigenes Add-on entwickelt und der Allgemeinheit zur Verfügung stellt.

Viele Grüße

Susanne

Foto
1

Ich möchte an dieser Stelle nochmal SirPounce danken, dass er seine Arbeit mit anderen teilt und ehrenamtlich hier im Forum - sogar am Wochenende und das seit Jahren - anderen Nutzern hilft. Seine Add-Ons sind voller guter Ideen, von denen wir uns gerne die eine oder andere Scheibe abschneiden möchten! Merci vielmals aus der Schweiz!

Herzlichst

Peter

Foto
2

SirPounce, da ist eine Entschuldigung von mir angebracht. Verzeih bitte. Du hast ganz recht, natürlich bin ich glücklich darüber, dass du deine Arbeit mit den Nutzern teilst und auch hier im Forum rege unterwegs bist - nebenbei.

Ich werde es bei GitHub einstellen. Einen schönen Urlaub noch, wenn ich deine Zeilen korrekt deuten darf.

Und Danke auch an das Citavi-Team für eure nützliche Software und eure Arbeit im Forum.

Foto