Onlangs wilde ik een back-up maken van mijn UDK 3-projectbestanden naar mijn Dropbox, maar UDK vereist dat projectbestanden zich in dezelfde map bevinden als de (4GB) installatie zelf - en 4GB is veel te groot voor mijn Dropbox! In dit artikel leert u hoe u dit probleem kunt oplossen door bestanden op twee plaatsen tegelijk te laten lijken, met behulp van harde links, symbolische links, en kruispunten.
Voorbeeldafbeelding pictogram door P. J. Onori.
Wanneer u uw harde schijf defragmenteert en de informatie wordt verplaatst, houdt geen van uw opgeslagen bestanden op te werken alleen omdat de informatie op een andere plaats is opgeslagen. Dit komt omdat uw besturingssysteem een abstractielaag heeft die dit allemaal beheert; in feite is wat u klikt om een afbeelding of uitvoerbaar bestand te openen slechts een link naar het gewenste bestand of de gewenste gegevens.
Uitgaand van dit, kun je afleiden dat je meer dan één link naar de dezelfde item; foo.exe
en bar.exe
kon exact hetzelfde programma openen!
Laten we wat technischer worden ...
Tip: Dit is eigenlijk een functie van POSIX-compatibele bestandssystemen, zoals NTFS. Dat gezegd hebbende, dit zal NIET werken op FAT, FAT32, exFAT en ReFS.
Harde links zijn vergelijkbaar met bestandssnelkoppelingen; ze stellen u in staat om op verschillende locaties toegang te hebben tot hetzelfde bestand. Het belangrijkste verschil is dat dit wordt geïmplementeerd in het bestandssysteem zelf, dus wanneer u een harde koppeling naar een bestand maakt, maakt u gewoon een nieuwe naam ervoor en het is exact hetzelfde bestand, waarbij beide namen naar exact dezelfde locatie op de harde schijf verwijzen.
Als u wijzigingen in het bestand aanbrengt via ieder van de "namen" (dat wil zeggen, als u het originele bestand of een van de harde links opent en deze wijzigt), zullen de wijzigingen worden doorgevoerd naar alle andere plaatsen waar het bestand bestaat, met betrekking tot de bestandskenmerken en het bestand zelf.
Elk bestand zal bestaan totdat al zijn harde links zijn verwijderd; wanneer dat gebeurt, wordt de ruimte die door het bestand wordt gebruikt als gratis gedeclareerd. (U kunt een bestandherstelprogramma gebruiken om uw bestand terug te krijgen, maar dat werkt niet gegarandeerd.)
Harde links zijn naar bestanden wat kruispunten zijn voor mappen, partities of volumes, op (en alleen op) hetzelfde systeem. Beide worden geïnterpreteerd op het niveau van het besturingssysteem en zijn daardoor transparant voor programma's en gebruikers.
In tegenstelling tot het bovenstaande, symbolische links kan zowel voor bestanden als voor mappen worden gebruikt, dus in wezen en perceptie lijken ze echt op shortcuts.
Het verschil is dat een symbolische koppeling verwijst naar het originele bestandspad in plaats van naar de locatie van het bestand op uw harde schijf. Dit betekent dat als u de inhoud van het bestand wijzigt, er nog steeds een symbolische koppeling naar verwijst (en de wijzigingen weerspiegelt), maar als u de naam van het originele bestand, zal de symbolische link er niet langer naar verwijzen.
Ik heb dit gebruikt om een paar praktische problemen op te lossen.
Iedereen die met UDK 3 heeft gewerkt weet dat, hoewel de engine geweldig is, de projectbeheerworkflow omslachtig is. Het is bijvoorbeeld niet onbelangrijk om met meerdere projecten in dezelfde installatie te werken, daarom hebben ontwikkelaars meestal meerdere installaties voor meerdere projecten. Het wordt erger als je begint na te denken over het maken van een back-up van je project, zoals ik hierboven al zei.
Voor mijn privéprojecten gebruik ik altijd twee back-upoplossingen: bronbeheer en cloudback-up, respectievelijk met BitBucket en Dropbox. Het instellen van het bronbeheer van uw code in UDK is triviaal, maar wat als u een back-up van uw aangepaste project wilt maken met een cloudback-upoplossing zoals Dropbox waarbij alle bestanden in een specifieke systeemmap moeten staan?
Dit is mijn oplossing:
Tip: U kunt geen symbolische koppelingen gebruiken; UDK zal dat detecteren en een fout veroorzaken.
Ik heb altijd problemen gehad met de manier waarop ik mijn muziekbibliotheek-map heb georganiseerd; omdat ik nooit fan was van het gebruik van apps zoals iTunes, en ik wilde mijn harde schijf schoon en georganiseerd houden. Na jarenlang geprobeerd te hebben verschillende benaderingen uit te proberen, vond ik het het meest één map per artiest en, binnenin, de respectievelijke artiest-singles en meerdere mappen per album.
Dat is allemaal goed, totdat je singles tegenkomt van één artiest met nog eens twintig. Wat ga je eraan doen, kopieer hetzelfde bestand naar de map van elke artiest? Nee; gebruik harde links!
U kunt deze koppelingen als volgt instellen voor de drie belangrijkste besturingssystemen.
In Windows kunt u dit doen met behulp van de opdrachtregel zonder iets te installeren of via de Verkenner-gebruikersinterface na de installatie van een kleine tool met de naam Link Shell Extension.
Als u de opdrachtregel gebruikt, opent u een verhoogde opdrachtregelprompt (dat wil zeggen een met beheerdersbevoegdheden), invoer mklink
, en druk op invoeren. U ziet de Help-informatie met uitleg over het maken van harde koppelingen, knooppunten en symbolische koppelingen naar directory's. U kunt bijvoorbeeld een harde koppeling tussen twee tekstbestanden maken door te bellen mklink / H c: \ file1.txt c: \ file2.txt
.
Om dit via Explorer te doen, download en installeer eerst Link Shell Extension. (Dit is mijn geprefereerde oplossing omdat het uitgebreide en nuttige functies heeft zoals volumepunten en overlay-iconen.) De workflow is heel eenvoudig; je kunt het in actie zien en leren hoe je het kunt gebruiken op de webpagina van het hulpprogramma.
In mijn zoektocht vond ik geen totale GUI-oplossing voor Linux; als je er een weet, laat het dan in de reacties achter.
Als u de terminal gebruikt, kunt u de ln
commando om harde koppelingen en symbolische koppelingen te maken. Probeer het bijvoorbeeld ln fooOriginele barLink
. Wikibooks heeft een eenvoudige handleiding voor ln, of je kunt de volledige specificatie lezen.
Er is een gedeeltelijke GUI-oplossing: in Ubuntu (en mogelijk andere Linux-varianten), kunt u symbolische koppelingen maken door een bestand met de middelste muisknop te slepen en te kiezen Hier linken.
Helaas heb ik geen GUI-applicatie gevonden die het maken van harde links mogelijk maakt.
OS X is een speciaal geval, omdat van directory-hardkoppelingen bekend is dat ze allerlei problemen veroorzaken. Bovendien is er nog een andere notie, vergelijkbaar met de anderen, maar geavanceerder: een alias.
Aliassen zijn vergelijkbaar met symbolische koppelingen, maar worden geïmplementeerd in een hoger niveau en robuustere structuur. Ze kunnen overal met bestanden en mappen worden gekoppeld, inclusief netwerkopslag, met behulp van een unieke ID. Een van de beste eigenschappen van aliassen is dat ze de wijzigingen in de bestandslocatie in de gaten houden; dat wil zeggen, ze breken niet wanneer het originele bestand naar een andere plaats wordt verplaatst. Helaas kunnen sommige applicaties problemen hebben met het volgen van het doel.
Aan de andere kant, symbolische links (of symlinks) zijn lage systeembestanden die het pad van het doel bevatten; ze breken als je het originele bestand verplaatst, maar elke toepassing die het gebruikt, komt op de gewenste plaats aan. Symlinks zijn geweldig om te gebruiken met vooraf gedefinieerde systeem- of toepassingsmappen, of wanneer u uw gebruikersdocumenten of e-mailcache naar een ander station wilt verplaatsen.
Tip: Mac OS-gebruikers adviseren dat je waar mogelijk blijft plakken met aliassen en symbolische koppelingen.
In de Terminal kunt u de ln
commando net als in Linux.
In de GUI kunt u het contextmenu gebruiken om een alias te maken door met de rechtermuisknop op een bestand of map te klikken. Als alternatief kunt u symbolische koppelingen maken met de SymbolicLinker-app.
Een derde optie is om je eigen code te schrijven of de code uit deze GitHub-repository te compileren
Ik ben hier steeds verder van de ontwikkeling van games aan het afdrijven, maar ik denk dat het belangrijk is om de verscheidenheid aan problemen te tonen die je met dit concept kunt oplossen, zodat je goed voorbereid bent om het te gebruiken wanneer het de volgende keer geschikt is in je gamedev-workflow!
De meeste toepassingen zijn niet flexibel met betrekking tot het instellingenpad van de gebruiker, dus u kunt koppelingen gebruiken om dit probleem op te lossen in het geval u een back-up van de informatie wilt maken of deze ergens anders wilt bewaren en organiseren.
In Linux kunt u ook symbolische koppelingen gebruiken om een back-up te maken van uw basismap naar een ander station:
In Windows, vooral als u een vrij kleine SSD hebt, kunt u links gebruiken om uw Windows-installatie te scheiden van uw Gebruiker
en Programmabestanden
mappen:
Programmabestanden
en gebruikers
mappen naar een afzonderlijke schijf en maak knooppunten voor de paden van de oorspronkelijke mappen.Of, als u Linux en Windows dual-boot gebruikt, kunt u koppelingen gebruiken om dezelfde persoonlijke bestanden op beide besturingssystemen te bewaren. Dit is met name handig in scenario's waarbij u zowel in OS als e-mail- of Dropbox-toegang nodig hebt, maar natuurlijk niet wilt dat uw bestanden dubbel worden gedupliceerd.
U kunt één groot programma met meerdere functies maken dat afhankelijk is van de naam van de toepassing om te bepalen welke functie het zal uitvoeren. (Dat wil zeggen, dezelfde applicatie heeft meerdere harde links die alleen in naam verschillen.) Dit gebeurde eigenlijk in oude Unix-systemen, waar mv
, cp
en rm
heeft hetzelfde uitvoerbare bestand uitgevoerd. Als u erover nadenkt, kan het verplaatsen van een bestand in het slechtste geval een cp
en rm
en met deze methode kunt u het grootste deel van de code delen en de opslagvereisten voor vergaderingen tot een minimum beperken.
Terwijl ik dit aan het onderzoeken was, probeerde ik het uit in C # en Windows 8.1; in mijn onderzoek heb ik ontdekt dat er veel manieren zijn om de bestandsnaam van een programma te krijgen, maar slechts enkele van die methoden kunnen de bestandsnaam van een harde link ophalen.
De bovenstaande afbeelding toont een testprogramma dat ik heb gemaakt om dit probleem te demonstreren. Zoals je ziet is de bestandsnaam van het eerste venster OriginalFileName.exe
en die van de tweede is HardlinkedFileName.exe
. De getoonde code is de code die nodig is voor de getoonde resultaten. Je kunt de code voor deze applicatie op deze GitHub-repo krijgen.
Ten slotte kun je, als een webontwikkelaar, tegen dezelfde problemen aanlopen als ik heb geschetst voor de ontwikkeling van UDK 3, vooral als je LAMP, WAMP of iets dergelijks gebruikt. U kunt een script coderen om harde links en symbolische koppelingen naar uw sitebestanden te maken, zodat de bestanden overal op uw opslagapparaten kunnen staan, maar u hoeft niets te veranderen om de site te testen.
Verwacht niet dat je dit dagelijks zult gebruiken, maar verwacht je gezegend te voelen als je een probleem hebt dat hiermee gemakkelijk is op te lossen. Het is een van die dingen die je in je achterhoofd houdt, omdat het op een dag nuttig zal zijn om het te weten.